Подтвердить что ты не робот

Как заставить cmake включить параметр "-pthread" во время компиляции?

Я знаю, что есть что-то вроде find_package(Threads), но, похоже, это не имеет значения (по крайней мере, само по себе). Пока я использую SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-pthread"), но это не похоже на правильное решение для меня.

4b9b3361

Ответ 1

find_package( Threads ) вызывает сначала модуль CMake, ищет файловую систему для соответствующего пакета потоков для этой платформы, а затем устанавливает переменную CMAKE_THREAD_LIBS_INIT (и некоторые другие переменные). Он не указывает CMake связывать любые исполняемые файлы с любой библиотекой нитей, которую он находит. Вы указываете, что CMake связывает исполняемый файл с библиотекой "Threads" с помощью команды target_link_libraries(). Так, например, скажем, ваша программа называется тестом. Чтобы связать его с потоками, вам необходимо:

find_package( Threads )
add_executable( test test.cpp )
target_link_libraries( test ${CMAKE_THREAD_LIBS_INIT} )

Ответ 2

Модуль Threads в последних версиях ( >= 3.1) CMake генерирует импортированную цель Threads:: Threads. Связывание вашей цели с Threads:: Threads добавляет все необходимые фреймы компиляции и связывания. Это можно сделать следующим образом:

set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
set(THREADS_PREFER_PTHREAD_FLAG TRUE)
find_package(Threads REQUIRED)

add_executable(test test.cpp)
target_link_libraries(test Threads::Threads)

Использование импортированного целевого объекта рекомендуется для нового кода в соответствии с Документами CMake

Ответ 3

Как насчет следующего:

set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
find_package(Threads REQUIRED)
if(CMAKE_USE_PTHREADS_INIT)
    set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-pthread")
elseif(...)
    ...
endif()
add_executable( test test.cpp )
target_link_libraries( test ${CMAKE_THREAD_LIBS_INIT} )