Как заставить cmake включить опцию "- pthread " во время компиляции? [дубликат]
На этот вопрос уже есть ответ здесь:
Я знаю, что есть что-то вроде find_package(Threads)
, но это, кажется, не имеет значения (по крайней мере, само по себе). Сейчас я использую SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-pthread")
, но это не похоже на правильное решение для меня.
3 ответа:
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} )
Модуль Threads в последних версиях (>=3.1) CMake генерирует Threads::Threads imported target . Связывание цели с потоками:: 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 docs