【问题标题】:Single threaded application with Boost and CMake带有 Boost 和 CMake 的单线程应用程序
【发布时间】:2015-07-26 19:29:49
【问题描述】:

我正在编写一个单线程应用程序。我使用 CMake 来编译它。我的应用程序是使用 Boost 用 C++ 编写的。当我的应用程序运行“make”链接失败并显示以下错误消息:

Linking CXX executable whisk
cd <project>/build/src && /usr/bin/cmake -E cmake_link_script CMakeFiles/whisk.dir/link.txt --verbose=1
/usr/bin/c++      CMakeFiles/whisk.dir/driver_simdag.cpp.o CMakeFiles/whisk.dir/whisk.cpp.o CMakeFiles/whisk.dir/driver_miror.cpp.o CMakeFiles/whisk.dir/driver.cpp.o CMakeFiles/whisk.dir/main.cpp.o  -o whisk -rdynamic -lboost_program_options 
/usr/bin/ld: CMakeFiles/whisk.dir/whisk.cpp.o: undefined reference to symbol 'pthread_rwlock_unlock@@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

这是错误本身:

 undefined reference to symbol 'pthread_rwlock_unlock@@GLIBC_2.2.5'

我的 src 目录中的 CMakeLists.txt 如下:

file(GLOB whisk_SRC "[a-zA-Z]*.cpp")
add_executable(whisk ${whisk_SRC})

FIND_PACKAGE( Boost 1.40 COMPONENTS program_options log REQUIRED )
set(Boost_USE_MULTITHREADED      OFF)
# set_property(TARGET whisk PROPERTY Boost_USE_MULTITHREADED OFF)
INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} )

set_property(TARGET whisk PROPERTY CXX_STANDARD 11)
set_property(TARGET whisk PROPERTY CXX_STANDARD_REQUIRED ON)

target_link_libraries(whisk ${Boost_PROGRAM_OPTIONS_LIBRARY})

install(TARGETS whisk DESTINATION bin)

我如何告诉 CMake 和 Boost 我根本不使用 pthread 并且我想要编译单线程版本?

【问题讨论】:

  • CMake 在这里如何相关,你能从命令行成功编译吗?您的 Boost 库是否可能在单线程版本中不可用(使用 ldd 查找依赖项)?另外,您对单线程版本有何期望?
  • 尝试使用 threading=single 构建提升。
  • @UlrichEckhardt 当我从命令行编译时,我发现我有同样的问题。所以,也许你是对的,cmake 在这里可能无关紧要。我想要单线程版本,因为我确信我不需要线程安全,因为我的应用程序总是单线程的。

标签: c++ boost cmake


【解决方案1】:

根据FindBoost文档页面,需要使用

Boost_USE_MULTITHREADED - 设置为 OFF 以使用非多线程 库('mt' 标签)。默认为开启。

在调用find_package(Boost) 之前设置它。在my answerLinking boost library with Boost_USE_STATIC_LIB OFF on Windows 中,我详细展示了我如何使用cmake 来对抗boost。回答您问题的相关部分是

set(Boost_USE_MULTITHREADED OFF)
find_package( Boost 1.57.0 COMPONENTS system filesystem REQUIRED )

在使用 makefile 时,我经常发现使用 make VERBOSE=1 来查看 make 系统正在调用哪些命令很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多