web-dev-qa-db-fra.com

Comment forcer cmake à inclure l'option "-pthread" lors de la compilation?

Je sais qu'il y a quelque chose comme find_package(Threads) mais cela ne semble pas faire de différence (au moins en soi). Pour l'instant, j'utilise SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-pthread"), mais cela ne me semble pas être une bonne solution.

33
Tomasz Grobelny

find_package( Threads ) appelle un module CMake qui commence par rechercher dans le système de fichiers le package de threads approprié pour cette plate-forme, puis définit la variable CMAKE_THREAD_LIBS_INIT (et certaines autres variables également). Il ne dit pas à CMake de lier les exécutables à la bibliothèque de threads qu'il trouve. Vous dites à CMake de lier votre exécutable à la bibliothèque "Threads" avec la commande target_link_libraries(). Ainsi, par exemple, disons que votre programme s'appelle test. Pour le lier à des fils, vous devez:

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

Le module Threads dans les dernières versions (> = 3.1) de CMake génère la cible Threads :: Threads importée . Lier votre cible contre Threads :: Threads ajoute tous les drapeaux de compilation et de liaison nécessaires. Cela peut être fait comme ceci:

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)

L'utilisation de la cible importée est fortement recommandée pour le nouveau code, selon les CMake docs

43
Alex Che

Qu'en est-il des éléments suivants:

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} )
6
user3701085