CMake FindThreads与现代C ++的正确用法是什么?

时间:2019-01-14 21:46:44

标签: c++11 cmake

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_FOUNDtrue,而CMAKE_USE_PTHREADS_INIT1,但是在编译过程中我没有得到-pthread,在链接过程中却没有得到-lpthread。我检查了模块中提到的许多其他变量,但未尝试设置的所有变量。

有正确的方法吗?还是我应该只使用正常的标志继续生活?

1 个答案:

答案 0 :(得分:2)

find_package( Threads )
target_link_libraries( ${PROJECT_NAME} ${CMAKE_THREAD_LIBS_INIT} )

另请参阅https://stackoverflow.com/a/5402608/10838321