C++ Boost log、GCC 4.4和CMake

C++ Boost log、GCC 4.4和CMake,c++,linux,gcc,boost,cmake,C++,Linux,Gcc,Boost,Cmake,我正在尝试使用GCC4.4.5、CMAKE2.8.2和Boost1.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

我正在尝试使用GCC4.4.5、CMAKE2.8.2和Boost1.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和/或boost_-thread)有关。(或两者兼有)

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

试着做:

设置(CMAKE\u THREAD\u preference\u PTHREAD true)
查找包(线程)
如果(找到线程)
INCLUDE_目录(系统${Threads_INCLUDE_DIR})
消息(“我们正在使用pthreads吗?${CMAKE_USE_pthreads_INIT}”)
目标链接库(${PROJECT\u NAME}${CMAKE\u THREAD\u LIBS\u 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_包中组件之后指定的元素的顺序无关紧要)

看起来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库的未定义引用?GCC4.4非常旧(当前的GCC4.8)。你考虑过升级吗?据我所知,我没有任何p螺纹相关的错误。这些问题通过添加CMake文件的查找(线程)部分得到解决。GCC 4.4确实很旧,但现在我们的软件需要(由于外部合作伙伴)。感谢您的建议!我两种都试过了,但都没有积极的效果。CMake的Boost include和library dir输出是正确的。Boost_库似乎也是正确的。优化/home/c00/boost/boost_1_53_0_安装/lib/libboost_系统-mt.a;调试/home/c00/boost/boost\u 1\u 53\u 0\u安装/lib/libboost\u system-mt-d.a;[etc…]线程的输出:我们正在使用pthreads吗?1.线程链接标记:-lpthread@CoertMetz正如我看到的,您使用的是非系统范围的Boost安装,您是否将Boost_ROOT变量设置为正确的路径集(Boost_ROOT h)‌​ome/c00/boost/boost_1_53_0_安装)在FIND_软件包(boost 1.53.0…?您是否也尝试过从FIND_软件包中删除1.53.0?还尝试运行make VERBOSE=1或SET(CMAKE_VERBOSE_MAKEFILE ON)在CMakeLists.txt中,我认为您正在使用的Boost头和您正在链接的Boost库之间可能存在不匹配,如果您的主目录中同时安装了系统范围的Boost和本地Boost,则CMake可能会感到困惑。请仔细检查您是否链接了正确的Boost_线程(-mt或否)而且,头文件和库之间的pthad不匹配可能是问题所在。我如何确保GCC使用我自己的1.5 3.0个头而不是系统范围的头?C++命令有:-ISSt/Hoo/C0/Booo/BooStY1153Y00Auth/Ipple,所以应该是OK还是不?我如何知道正确的pTHOL是什么?