【问题标题】:Boost log, GCC 4.4 and CMakeBoost 日志、GCC 4.4 和 CMake
【发布时间】:2013-05-08 13:21:20
【问题描述】:

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

编译 boost 和 boost 日志成功,但是在将我的测试程序链接到 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*)'

我确实链接了线程库。有人知道怎么解决吗?

【问题讨论】:

  • 您是否获得了对 pthreads 库的未定义引用?
  • GCC 4.4 真的很旧(当前的 GCC 是 4.8)。你考虑过升级吗?
  • 据我所知,我没有收到任何与 pthreads 相关的错误。通过添加 CMake 文件的 FIND(Threads) 部分解决了这些问题。
  • GCC 4.4 确实老了,但现在我们的软件需要(由于外部合作伙伴)。

标签: c++ linux gcc boost cmake


【解决方案1】:

似乎 boost.log 依赖于 boost.thread 库,那么您需要更改库的顺序。见why link order does matter

试试下面的顺序

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})

【讨论】:

    【解决方案2】:

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

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

    试一试:

    SET(CMAKE_THREAD_PREFER_PTHREAD true)
    FIND_PACKAGE(线程)
    IF(Threads_FOUND)
    INCLUDE_DIRECTORIES(SYSTEM ${Threads_INCLUDE_DIR})
    MESSAGE("我们在使用 pthread 吗?${CMAKE_USE_PTHREADS_INIT}")
    TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${CMAKE_THREAD_LIBS_INIT})
    ENDIF()

    查看您拥有的 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 之后指定的元素的顺序无关紧要)

    【讨论】:

    • 感谢您的建议!我都试过了,bot都没有积极的效果。 CMake 的 Boost 包含和库目录输出是正确的。 Boost_LIBRARIES 似乎也是正确的。优化;/home/c00/boost/boost_1_53_0_install/lib/libboost_system-mt.a;调试;/home/c00/boost/boost_1_53_0_install/lib/libboost_system-mt-d.a; [etc ...] 线程输出:我们使用的是 pthreads 吗? 1. 线程链接标签:-lpthread
    • @CoertMetz 我看到您使用的是非系统范围的 Boost 安装,您是否在 FIND_PACKAGE( Boost 1.53.0...?您是否也尝试过从 FIND_PACKAGE 中删除 1.53.0?还尝试在 CMakeLists 中运行 make VERBOSE=1SET(CMAKE_VERBOSE_MAKEFILE ON) .txt
    • 我认为您正在使用的 Boost 标头与您要链接的 Boost 库之间也可能存在不匹配,如果您家中既有系统范围的 Boost 安装,也有本地安装目录,CMake 可能会感到困惑。 仔细检查您是否链接到正确的 boost_thread(-mt 或非)和 pthread
    • 标题和库之间的不匹配可能确实是问题所在。如何确保 gcc 使用的是我自己的 1.53.0 标头而不是系统范围的标头?
    • C++ 命令有:-isystem /home/c00/boost/boost_1_53_0_install/include,这样应该可以吗?我怎么知道正确的 pthread 是什么?
    猜你喜欢
    • 2017-12-23
    • 2019-01-01
    • 2012-03-04
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多