Cmake и libpthread Я запускаю RHEL 5.1 и использую gcc. Как я могу сказать cmake добавить -pthread к компиляции и связыванию? Ответ 1 Следующее должно быть чистым (с использованием find_package) и работать (модуль find называется FindThreads): cmake_minimum_required (VERSION 2.6) find_package (Threads) add_executable (myapp main.cpp ...) target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT}) Ответ 2 @Manuel был в стороне. Вы также можете добавить параметр компилятора, например: Если у вас есть CMake 3.1.0+, это станет еще проще: set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) target_link_libraries(my_app 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() Для версий Older 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). Ответ 3 Вот правильный ответ: ADD_EXECUTABLE(your_executable ${source_files}) TARGET_LINK_LIBRARIES( your_executable pthread ) эквивалентно -lpthread
Ответ 1 Следующее должно быть чистым (с использованием find_package) и работать (модуль find называется FindThreads): cmake_minimum_required (VERSION 2.6) find_package (Threads) add_executable (myapp main.cpp ...) target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})
Ответ 2 @Manuel был в стороне. Вы также можете добавить параметр компилятора, например: Если у вас есть CMake 3.1.0+, это станет еще проще: set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) target_link_libraries(my_app 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() Для версий Older 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).
Ответ 3 Вот правильный ответ: ADD_EXECUTABLE(your_executable ${source_files}) TARGET_LINK_LIBRARIES( your_executable pthread ) эквивалентно -lpthread