我试图让使用GCC 4.4.5,2.8.2的CMake和Boost 1.53.0在Linux上运行一个简单的例子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*)'
我做链接线程库。 有谁知道如何解决这个问题?
好像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})
你给的链接错误有事情做与或者不链接到的本地线程库像并行线程和/或boost_thread。 (或两者)
1)从我看到你不要链接对pthread库。
仅仅通过打电话,试图找到库并不意味着它会连接反对它CMake的自定义模块。
试着这样做:
SET(CMAKE_THREAD_PREFER_PTHREAD真)
FIND_PACKAGE(线程)
IF(Threads_FOUND)
INCLUDE_DIRECTORIES(SYSTEM $ {} Threads_INCLUDE_DIR)
MESSAGE( “我们使用并行线程?$ {} CMAKE_USE_PTHREADS_INIT”)
TARGET_LINK_LIBRARIES($ {PROJECT_NAME} $ {} CMAKE_THREAD_LIBS_INIT)
万一()
检查你有关于使用线程模块的更多信息的CMake安装FindThreads.cmake文件。 您通常可以找到它在/usr/share/cmake-2.8/Modules/
2)也许链接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组件后指定的顺序没有关系的第二个论点可能是完全错误的)