【问题标题】:What is the proper use of CMake FindThreads with modern C++?CMake FindThreads 与现代 C++ 的正确用途是什么?
【发布时间】:2019-01-14 21:46:43
【问题描述】:

CMake 的来源 (https://github.com/Kitware/CMake/blob/master/Modules/FindThreads.cmake) 声称以下关于“FindThreads”功能:

如果使用线程完成 C++11 及更高版本,则不需要此模块 std::thread 来自标准库。

但如果我遵循这个建议(在我的 Mint18 x86_64 系统、gcc8、CMake 3.13.2 上)我会得到:

/usr/bin/ld: CMakeFiles/prism-esm-dummy.dir/src/main.cpp.o: undefined reference to symbol 'pthread_create@@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

如果该模块被执行(我可以使用其他 SO 文章和之前给出的建议):

set (THREADS_PREFER_PTHREAD_FLAG ON)
find_package (Threads REQUIRED)

add_executable(my_app main.cpp)
target_link_libraries (my_app Threads::Threads)

...结果是一样的。

THREADS_FOUNDtrueCMAKE_USE_PTHREADS_INIT1,但我在编译时没有得到 -pthread,或者在链接期间没有得到 -lpthread。我检查了模块中提到的许多其他变量,但我尝试的所有变量都没有设置。

有没有正确的方法来做到这一点?还是我应该只使用正常的旗帜并继续我的生活?

【问题讨论】:

  • 您是否在代码中直接使用pthread_* API?
  • 没有。我正在使用 std::thread。

标签: c++11 cmake


【解决方案1】:
find_package( Threads )
target_link_libraries( ${PROJECT_NAME} ${CMAKE_THREAD_LIBS_INIT} )

另见https://stackoverflow.com/a/5402608/10838321

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 2016-07-04
    • 2018-03-09
    • 2017-06-12
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多