我正在尝试使用GCC 4.4.5,CMake 2.8.2和Boost 1.53.0在Linux上运行一个简单的boost.log示例。
编译boost和boost日志成功了,但是当我的testing程序连接到boost.log时,我一直在收到问题。
我使用下面的CMakeLists.txt文件:
cmake_minimum_required(VERSION 2.8) project(QuantibBoostLogTest) # Include boost headers set(Boost_USE_STATIC_LIBS ON) set(Boost_USE_MULTITHREADED ON) find_package(Threads) find_package(Boost 1.53.0 COMPONENTS thread date_time filesystem system log log_setup REQUIRED) if(Boost_FOUND) include_directories( ${Boost_INCLUDE_DIRS} ) link_libraries(${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) else(Boost_FOUND) message(FATAL_ERROR "Cannot build Quantib Boost Log test without Boost. Please set Boost_DIR.") endif(Boost_FOUND) add_executable(quantibBoostLogTest boost_log_test.cxx) install(TARGETS quantibBoostLogTest DESTINATION .)
CMake确实检测到boost库,但我仍然得到链接器错误,主要是forms:
core.cpp:(.text+0x1b0e): undefined reference to `boost::detail::get_tss_data(void const*)'
我链接线程库。 有人知道如何解决这个问题吗?
看来boost.log取决于boost.thread库,那么你需要改变库的顺序。 看看为什么链接顺序很重要
尝试下面的顺序
find_package(Boost 1.53.0 COMPONENTS log log_setup thread date_time filesystem system REQUIRED)
如果它不会尝试包括他们两次如下
link_libraries(${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} ${Boost_LIBRARIES})
你给出的连接器错误与连接本地线程库(如pthreads和/或boost_thread)有关。 (或两者)
1)从我看到你不链接到pthreads库。
通过仅仅调用一个CMake自定义模块,试图找到库并不意味着它也会链接它。
尝试做:
SET(CMAKE_THREAD_PREFER_PTHREAD true)
FIND_PACKAGE(线程)
IF(Threads_FOUND)
INCLUDE_DIRECTORIES(SYSTEM $ {Threads_INCLUDE_DIR})
MESSAGE(“我们使用pthreads?$ {CMAKE_USE_PTHREADS_INIT}”)
TARGET_LINK_LIBRARIES($ {PROJECT_NAME} $ {CMAKE_THREAD_LIBS_INIT})
万一()
检查您所拥有的CMake安装的FindThreads.cmake文件,以获取有关使用线程模块的更多信息。 您通常可以在/usr/share/cmake-2.8/modulees/中找到它
2)也许链接的Boost库的顺序不正确,或者您为Boost指定的版本无效。
尝试更改升级版本,或者根本不指定或更改链接库的顺序
SET(Boost_USE_STATIC_LIBS ON) SET(Boost_USE_MULTITHREADED ON) FIND_PACKAGE(Boost 1.53.0 COMPONENTS **system thread filesystem date_time log log_setup** REQUIRED) IF(Boost_FOUND) INCLUDE_DIRECTORIES(SYSTEM ${Boost_INCLUDE_DIR}) LINK_DIRECTORIES(${Boost_LIBRARY_DIR}) MESSAGE("Boost information") MESSAGE("Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}") MESSAGE("Boost_LIBRARY_DIRS: ${Boost_LIBRARY_DIRS}") MESSAGE("Boost Libraries: ${Boost_LIBRARIES}") TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Boost_LIBRARIES}) ENDIF()
(第二个争用可能是完全错误的,因为我认为在FIND_PACKAGE中COMPONENTS之后指定的元素的顺序无关紧要)