ubuntu 16.04,gcc 5.4.0,cmake 3.5.1
差异是什么,哪个更好?
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)
答案 0 :(得分:4)
所有通话通常 错误。由@vre answered开始,您应该使用find_package(Threads)
代替。
呼叫
target_link_libraries(promise pthread)
和
target_link_libraries(promise -lpthread)
转换为相同链接器的命令行:对于不以-
开头的参数,CMake将自动添加-l
(来自target_link_libraries
{{3} }):
普通库名称:生成的链接行将要求链接器搜索库(例如
foo
变为-lfoo
或foo.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。通常,您应该使用-pthread
和target_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