Wir haben ein paar Anwendungen, die zu mehreren unserer eigenen Bibliotheken verlinken. Ich habe kürzlich eine neue Anwendung hinzugefügt, die auf diese Bibliotheken verweist, und dies wird erfolgreich unter Windows kompiliert.Warum "nicht definierte Referenz", wenn die Variable definiert und die Bibliothek verknüpft ist?
Unter Linux sehe ich jedoch eine "undefined Referenz" Fehler auf eine statische Variable, was natürlich bedeutet, dass die Variable nicht definiert war. Der Fehler tritt in einer Bibliothek auf, aber nur, wenn er mit der neuen Anwendung verknüpft ist (die vorhandenen Anwendungen sind immer noch gut verlinkt). Wie Sie sehen können, sagt der Compiler, dass kAppVersion
nicht definiert ist. Wenn es tatsächlich in Version.cpp definiert ist, und gemeinsame ist verknüpft (in CMakeLists.txt angegeben). Wir dachten, dass es etwas mit target_link_libraries
Bestellung zu tun, aber common
zu vor base
(wo der Fehler auftritt) hat keine Wirkung scheint es. Außerdem scheint die Reihenfolge in anderen CMakeLists.txt (z. B. für Synergys) irrelevant zu sein, da diese Anwendung erfolgreich kompiliert wird. Diese ähnliche Frage scheint, dass Ordnungsfragen andeuten, aber ich habe keinen Erfolg damit hatte:
qustion: library is linked but reference is undefined
Meine einzige Idee ist, dass es etwas falsch in synergyd.cpp oder CDaemonApp.cpp sein könnte - aber ich kann nichts Offensichtliches sehen, das unter Linux kompiliert, aber nicht unter Windows.
Scanning dependencies of target synergyd
[ 90%] Building CXX object src/cmd/synergyd/CMakeFiles/synergyd.dir/synergyd.o
Linking CXX executable ../../../../../bin/debug/synergyd
../../../../../lib/debug/libarch.a(CArch.o): In function `~XExitApp':
/srv/buildbot/synergy/1.4-linux32/build/src/lib/arch/../synergy/XSynergy.h:114: undefined reference to `vtable for XExitApp'
../../../../../lib/debug/libarch.a(CArch.o): In function `CArchAppUtil::exitApp(int)':
/srv/buildbot/synergy/1.4-linux32/build/src/lib/arch/CArchAppUtil.h:31: undefined reference to `XExitApp::XExitApp(int)'
/srv/buildbot/synergy/1.4-linux32/build/src/lib/arch/CArchAppUtil.h:31: undefined reference to `typeinfo for XExitApp'
../../../../../lib/debug/libarch.a(CArchAppUtilUnix.o): In function `CArchAppUtilUnix::parseArg(int const&, char const* const*, int&)':
/srv/buildbot/synergy/1.4-linux32/build/src/lib/arch/CArchAppUtilUnix.cpp:32: undefined reference to `CApp::isArg(int, int, char const* const*, char const*, char const*, int)'
/srv/buildbot/synergy/1.4-linux32/build/src/lib/arch/CArchAppUtilUnix.cpp:37: undefined reference to `CApp::isArg(int, int, char const* const*, char const*, char const*, int)'
../../../../../lib/debug/libbase.a(CLog.o): In function `CLog::insert(ILogOutputter*, bool)':
/srv/buildbot/synergy/1.4-linux32/build/src/lib/base/CLog.cpp:213: undefined reference to `kAppVersion'
collect2: ld returned 1 exit status
make[2]: *** [../../bin/debug/synergyd] Error 1
make[1]: *** [src/cmd/synergyd/CMakeFiles/synergyd.dir/all] Error 2
make: *** [all] Error 2
Der vollständige Code kann von our repository durchsucht werden.
Ich habe einen Kommentar zur Bestellung wusste kommen würde, weshalb ich so viel Zeit in der Frage verbracht - wie Sie sehen können, Bestellung gemeinsam vor Base hat das Problem nicht behoben. –
Die Reihenfolge der Verknüpfung ist wichtig, es sei denn, die Bibliothek ist mit der Option '--no-as-needed' von ld verknüpft. –
Ich sage nicht, dass Reihenfolge der Verknüpfung nicht wichtig ist - bitte lesen Sie, was ich sage. Ich habe versucht, die Reihenfolge zu ändern und es hat das Problem nicht gelöst. Das Problem wird möglicherweise nicht durch die Verknüpfungsreihenfolge in diesem Fall verursacht (es sei denn, CMake ändert es irgendwie). –