cmake中pthread和-pthread选项之间的区别是什么?

时间:2018-04-11 06:58:22

标签: c++ cmake pthreads

环境

ubuntu 16.04,gcc 5.4.0,cmake 3.5.1

问题

  1. target_link_libraries(promise pthread)
  2. target_link_libraries(promise -pthread)
  3. target_link_libraries(promise -lpthread)
  4. 差异是什么,哪个更好?

    问题

    promise.cpp

    std::promise<int> pr;
    auto fut = pr.get_future();
    pr.set_value(10); // throw std::exception and terminate
    

    的CMakeLists.txt

    add_executable(promise promise.cpp)
    target_link_libraries(promise pthread)
    

    解决方案

    稍微修改CMakeLists.txt。

    add_executable(promise promise.cpp)
    target_link_libraries(promise -pthread)
    

    我从here找到答案。但我不知道为什么?

    但是,最好的解决方案是便携式。

    set(THREADS_PREFER_PTHREAD_FLAG ON)
    find_package(Threads)
    target_link_libraries(promise Threads::Threads)
    

3 个答案:

答案 0 :(得分:4)

所有通话通常 错误。由@vre answered开始,您应该使用find_package(Threads)代替。

但所有这些调用有效相同!

呼叫

target_link_libraries(promise pthread)

target_link_libraries(promise -lpthread)

转换为相同链接器的命令行:对于不以-开头的参数,CMake将自动添加-l(来自target_link_libraries {{3} }):

  

普通库名称:生成的链接行将要求链接器搜索库(例如foo变为-lfoofoo.lib)。< / p>

通话时

target_link_libraries(promise -lpthread)

target_link_libraries(promise -pthread)

被翻译成不同的标志,用于链接进程这些标志意味着相同。

选项-pthread,传递给gcc documentation。但target_link_libraries的参数不用于编译

为什么使用find_package(Threads)是正确的

如果使用

set(THREADS_PREFER_PTHREAD_FLAG ON) # Without this flag CMake may resort to just '-lpthread'
find_package(Threads)

创建了一个库目标 Threads::Threads,其附加的编译和链接选项-pthread作为接口附加到其中。

使用时

target_link_libraries(promise Threads::Threads)

CMake自动传播界面编译和链接选项,因此promise目标是编译链接与{{1}选项。

答案 1 :(得分:1)

首先,我们可以使用cmake -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON查看make的基础命令。

target_link_libraries(promise pthread)target_link_libraries(promise -lpthread)会产生相同的链接选项:-lpthread,如:

/usr/bin/c++   -std=c++11  -rdynamic CMakeFiles/promise.dir/promise.cpp.o  -o promise -lpthread

但是,target_link_libraries(promise -pthread)会为您提供-pthread选项:

/usr/bin/c++   -std=c++11  -rdynamic CMakeFiles/promise.dir/promise.cpp.o  -o promise -pthread

-pthread-lpthread之间的差异得到了很好的解释here。通常,您应该使用-pthreadtarget_link_libraries(promise -pthread)

btw,clang内置二进制文件似乎没有两个选项。

答案 2 :(得分:1)

我建议通过导入目标使用现代CMake方法:

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads)
target_link_libraries(promise Threads::Threads)

这不仅添加了库依赖项,还设置了编译选项,几乎适用于所有平台。有关详细信息,请参阅以下帖子的答案: Difference between -pthread and -pthreads for C/C++ on Ubuntu 14.04

查看FindThreads.cmake模块的精细文档: https://cmake.org/cmake/help/v3.11/module/FindThreads.html