Ошибка компоновщика при компиляции исполняемого файла, который использует Boost.Thread при ссылке на статическую библиотеку с использованием Boost.Thread - PullRequest
0 голосов
/ 02 мая 2011

У меня есть статическая библиотека с именем MyAwesomeLib. Он построен с CMakeLists.txt ниже

PROJECT(MyAwesomeLib)

find_package(OpenCV)
find_package(VTK REQUIRED)
find_package(OpenGL)
find_package(GLUT)

set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
FIND_PACKAGE(Boost COMPONENTS thread)

if(NOT Boost_FOUND)
message(SEND_ERROR "Cannot find Boost Thread")
endif(NOT Boost_FOUND)

link_directories (${Boost_LIBRARY_DIRS})
include_directories(${Boost_INCLUDE_DIR} ${GLUT_INCLUDE_DIR})

INCLUDE(${VTK_USE_FILE})

file(GLOB SRCS "*.cpp" "*.c")
file(GLOB HDRS "*.h")
add_library(MyAwesomeLib STATIC ${SRCS} ${HDRS})
target_link_libraries(MyAwesomeLib ${OpenCV_LIBS} ${Boost_LIBRARIES} ${GLUT_LIBRARY} ${OPENGL_LIBRARY})

Теперь я хочу построить MyAwesomeExecutable, для которого нужны символы из MyAwesomeLib. И исполняемый файл, и библиотека используют Boost.Thread (thread_group и класс thread).

PROJECT(MyAwesomeExecutable)

FIND_PACKAGE(OpenCV REQUIRED)
FIND_PACKAGE(VTK REQUIRED)

set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
FIND_PACKAGE(Boost COMPONENTS thread)

if(NOT Boost_FOUND)
message(SEND_ERROR "Cannot find Boost Thread")
endif(NOT Boost_FOUND)

link_directories (${Boost_LIBRARY_DIRS})
include_directories(${Boost_INCLUDE_DIR} ${GLUT_INCLUDE_DIR})

INCLUDE(${VTK_USE_FILE})

FILE(GLOB SRCS "*.cpp" "*.c")
FILE(GLOB HDRS "*.h")

ADD_EXECUTABLE(MyAwesomeExecutable ${SRCS} ${HDRS})
TARGET_LINK_LIBRARIES(MyAwesomeExecutable MyAwesomeLib ${Boost_LIBRARIES} ${GLUT_LIBRARY} ${OPENGL_LIBRARY} ${OpenCV_LIBS})

Когда я собираю MyAwesomeExecutable, Visual Studio 2010 автоматически строит свою зависимость MyAwesomeLib. MyAwesomeLib строит просто отлично. Но сборка MyAwesomeExecutable дает следующие ошибки компоновщика:

2>MyAwesomeExecutable.obj : error LNK2019: unresolved external symbol "public: void __cdecl boost::thread::join(void)" (?join@thread@boost@@QEAAXXZ) referenced in function "public: void __cdecl boost::thread_group::join_all(void)" (?join_all@thread_group@boost@@QEAAXXZ)
2>MyAwesomeLib.lib(Face.obj) : error LNK2001: unresolved external symbol "public: void __cdecl boost::thread::join(void)" (?join@thread@boost@@QEAAXXZ)
2>MyAwesomeExecutable.obj : error LNK2019: unresolved external symbol "public: __cdecl boost::thread::~thread(void)" (??1thread@boost@@QEAA@XZ) referenced in function "public: void * __cdecl boost::thread::`scalar deleting destructor'(unsigned int)" (??_Gthread@boost@@QEAAPEAXI@Z)
2>MyAwesomeLib.lib(Face.obj) : error LNK2001: unresolved external symbol "public: __cdecl boost::thread::~thread(void)" (??1thread@boost@@QEAA@XZ)
2>MyAwesomeExecutable.obj : error LNK2019: unresolved external symbol "private: void __cdecl boost::thread::start_thread(void)" (?start_thread@thread@boost@@AEAAXXZ) referenced in function "public: __cdecl boost::thread::thread<class boost::_bi::bind_t<void,void (__cdecl*)(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >),class boost::_bi::list1<class boost::_bi::value<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > >(class boost::_bi::bind_t<void,void (__cdecl*)(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >),class boost::_bi::list1<class boost::_bi::value<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > >,struct boost::thread::dummy *)" (??$?0V?$bind_t@XP6AXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@ZV?$list1@V?$value@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@_bi@boost@@@_bi@boost@@@_bi@boost@@@thread@boost@@QEAA@V?$bind_t@XP6AXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@ZV?$list1@V?$value@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@_bi@boost@@@_bi@boost@@@_bi@1@PEAUdummy@01@@Z)
2>MyAwesomeLib.lib(Face.obj) : error LNK2001: unresolved external symbol "private: void __cdecl boost::thread::start_thread(void)" (?start_thread@thread@boost@@AEAAXXZ)

1 Ответ

0 голосов
/ 02 мая 2011

Статическая библиотека - это просто набор объектных файлов. Он может хорошо компилироваться, потому что не использует неопределенные символы. Можно сделать несколько проверок, чтобы убедиться, что библиотеки boost действительно связаны с вашей библиотекой. Пожалуйста, сделайте это, чтобы предоставить больше информации.

1.Использование cmake распечатывает значения из Boost_LIBRARY_DIRS и Boost_INCLUDE_DIRS для проверки связанных библиотек наддува.

2. Проверьте link.txt файл, созданный cmake. Этот файл создается для каждой цели, такой как библиотека или исполняемый файл, и в Linux он помещается в buildir/path/to/target/folder/CMakeFiles/targetName.dir/link.txt. link.txt содержит команду компилятора для сборки и компоновки исполняемого файла. С его помощью вы можете проверить, действительно ли библиотеки потоков потоков связаны с вашим исполняемым файлом. В VS link.txt не генерируется, как сказано в комментарии к этому ответу. Затем вы можете проверить командную строку компоновщика с помощью самой VS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...