Coe*_*etz 15 c++ linux gcc boost cmake
我试图在Linux上使用GCC 4.4.5,CMake 2.8.2和Boost 1.53.0运行一个简单的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 .)
Run Code Online (Sandbox Code Playgroud)
CMake确实正确检测了boost库,但我仍然遇到链接器错误,主要是以下形式:
core.cpp:(.text+0x1b0e): undefined reference to `boost::detail::get_tss_data(void const*)'
Run Code Online (Sandbox Code Playgroud)
我链接线程库.有人知道如何解决这个问题吗?
小智 20
看起来boost.log依赖于boost.thread库然后你需要改变库的顺序.了解链接顺序的重要性
请尝试以下订单
find_package(Boost 1.53.0 COMPONENTS log log_setup thread date_time filesystem system REQUIRED)
Run Code Online (Sandbox Code Playgroud)
如果不能帮助尝试将它们包括两次,如下所示
link_libraries(${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} ${Boost_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
您给出的链接器错误与未链接到 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 })
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()
Run Code Online (Sandbox Code Playgroud)
(第二个争论可能是完全错误的,因为我认为 FIND_PACKAGE 中 COMPONENTS 之后指定的元素的顺序并不重要)
| 归档时间: |
|
| 查看次数: |
6579 次 |
| 最近记录: |