16

我正在尝试使用 GCC 4.4.5、CMake 2.8.2 和 Boost 1.53.0 在 Linux 上运行一个简单的 boost.log 示例。

编译 boost 和 boost log 成功,但是在将我的测试程序链接到 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 库,但我仍然收到链接器错误,主要是以下形式:

core.cpp:(.text+0x1b0e): undefined reference to `boost::detail::get_tss_data(void const*)'

我确实链接了线程库。有谁知道如何解决这个问题?

4

2 回答 2

22

似乎 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})
于 2013-05-16T21:47:33.713 回答
2

您给出的链接器错误与未链接到本地​​线程库(如 pthreads 和/或 boost_thread)有关。(或两者)

1)据我所知,您没有链接到 pthreads 库。
仅仅调用一个试图找到库的 CMake 自定义模块并不意味着它也会链接到它。

尝试做:

SET(CMAKE_THREAD_PREFER_PTHREAD true)
FIND_PACKAGE (Threads)
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/Modules/ 中找到它

2)可能链接的Boost库的顺序不正确或者您为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 之后指定的元素的顺序无关紧要)

于 2013-05-14T11:26:50.900 回答