У нас есть несколько приложений, которые ссылаются на несколько наших собственных библиотек. Недавно я добавил новое приложение, которое ссылается на эти библиотеки, и это успешно компилируется в 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.
Я знал, что комментарий о упорядочении приходил, поэтому я провел так много времени на вопрос - как вы можете увидеть, заказав общий перед тем база не исправила проблему. –
Порядок связывания вопросов, если библиотека не связана с помощью параметра ld '-no-as-needed'. –
Я не говорю, что порядок ссылок не имеет значения - прочитайте, что я говорю. Я попытался изменить порядок и не решил проблему. Проблема может быть не обязательно вызвана привязкой порядка в этом случае (если cmake ее каким-то образом меняет). –