我正在运行RHEL 5.1并使用gcc。
RHEL 5.1
gcc
我如何告诉cmake将-pthread添加到编译和链接?
cmake
-pthread
下面是正确答案:
ADD_EXECUTABLE(your_executable ${source_files}) TARGET_LINK_LIBRARIES( your_executable pthread )
相当于
-lpthread
下面应该是干净的(使用find_package)和工作的(find模块被称为FindThreads):
find_package
FindThreads
cmake_minimum_required (VERSION 2.6) find_package (Threads) add_executable (myapp main.cpp ...) target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})
@Manuel已经走了一半了。你也可以添加编译器选项,像这样:
如果你有CMake 3.1.0+, 这就更简单了:
set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) target_link_libraries(my_app PRIVATE Threads::Threads)
如果你使用的是CMake 2.8.12+,你可以将其简化为:
find_package(Threads REQUIRED) if(THREADS_HAVE_PTHREAD_ARG) target_compile_options(my_app PUBLIC "-pthread") endif() if(CMAKE_THREAD_LIBS_INIT) target_link_libraries(my_app "${CMAKE_THREAD_LIBS_INIT}") endif()
较旧的CMake版本可能需要:
find_package(Threads REQUIRED) if(THREADS_HAVE_PTHREAD_ARG) set_property(TARGET my_app PROPERTY COMPILE_OPTIONS "-pthread") set_property(TARGET my_app PROPERTY INTERFACE_COMPILE_OPTIONS "-pthread") endif() if(CMAKE_THREAD_LIBS_INIT) target_link_libraries(my_app "${CMAKE_THREAD_LIBS_INIT}") endif()
如果你想在CMake 3.1+中使用前两个方法之一,你也需要set(THREADS_PREFER_PTHREAD_FLAG ON)。
set(THREADS_PREFER_PTHREAD_FLAG ON)
上面的target_compile_options解决方案是错误的,它不会链接库。
target_compile_options
使用:
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -pthread")
或
target_link_libraries(XXX PUBLIC pthread)
set_target_properties(XXX PROPERTIES LINK_LIBRARIES -pthread)