我们有几个应用程序链接到我们自己的几个库。我最近添加了一个链接到这些库的新应用程序,并且这在Windows上成功编译。定义变量并链接库时,为什么使用“未定义的引用”?
但是,在Linux上,我看到一个“未定义的引用”错误的静态变量,这当然意味着该变量未定义。该错误发生在库中,但只有链接到新应用程序时(现有应用程序仍可正常链接)。你可以看到,编译器说kAppVersion
是未定义的。实际上它在Version.cpp中定义,并且通用链接(在CMakeLists.txt中指定)。我们认为这可能与target_link_libraries
订购有关,但将common
移至base
(发生错误)之前似乎没有任何效果。此外,在其他CMakeLists.txt(例如对于协同)中,排序似乎是无关紧要的,因为此应用程序编译成功。这种类似的问题似乎暗示订购的问题,但我还没有任何这方面的成功:
Qustion:library is linked but reference is undefined
我唯一的想法是,它可能是一些错误的synergyd.cpp或CDaemonApp.cpp - 但我看不到在Linux上编译但不在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
完整的代码可以从our repository浏览。
我知道排序评论会进来,这就是为什么我花了这么多时间在这个问题上 - 你可以看到,之前订购常见基地没有纠正这个问题。 – 2012-04-06 10:06:54
连接顺序除非库使用ld的'--no-as-needed'选项链接。 – 2012-04-06 10:14:52
我不是说链接顺序无关紧要 - 请阅读我在说什么。我试过改变顺序,但它没有解决问题。这个问题可能不一定是由链接顺序造成的(除非cmake以某种方式改变它)。 – 2012-04-06 22:16:24