独自のライブラリのいくつかにリンクするアプリケーションがいくつかあります。最近、これらのライブラリにリンクする新しいアプリケーションを追加しましたが、これは Windows で正常にコンパイルされます。
ただし、Linux では、静的変数への「未定義の参照」エラーが表示されます。これはもちろん、変数が定義されていないことを意味します。エラーはライブラリで発生しますが、新しいアプリケーションにリンクされている場合のみです (既存のアプリケーションは引き続き正常にリンクされます)。
ご覧のとおり、コンパイラはそれkAppVersion
が未定義であると言います。実際にVersion.cppで定義し、common をリンクした場合 ( CMakeLists.txtで指定)。target_link_libraries
順番の関係かと思いましたがcommon
、前base
(エラーが発生した場所)に移動しても効果はないようです。さらに、他のCMakeLists.txt (例: シナジー用) では、このアプリケーションは正常にコンパイルされるため、順序は無関係に見えます。この同様の質問は、順序が重要であることを示唆しているように見えますが、私はこれで成功していません:
私の唯一の考えは、 synergyd.cppまたはCDaemonApp.cppに何か問題がある可能性があるということです。
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
完全なコードは、リポジトリから参照できます。