Comment forcer cmake à inclure l'option "-pthread" lors de la compilation? [dupliquer]
cette question a déjà une réponse ici:
je sais qu'il y a quelque chose comme find_package(Threads)
mais cela ne semble pas faire de différence (du moins en soi). Pour l'instant j'utilise SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-pthread")
, mais il ne semble pas comme une solution correcte pour moi.
3 réponses
find_package( Threads )
appelle un module CMake qui cherche d'abord dans le système de fichiers le paquet de threads approprié pour cette plate-forme, puis définit la variable CMAKE_THREAD_LIBS_INIT (et quelques autres variables également). Il ne dit pas à CMake de lier des exécutables à n'importe quelle bibliothèque de threads qu'il trouve. Vous dites à CMake de lier votre exécutable avec la bibliothèque "Threads" avec la commande target_link_libraries()
. Ainsi, par exemple, disons que votre programme est appelé test. Le lien à l'encontre de les fils dont vous avez besoin pour:
find_package( Threads )
add_executable( test test.cpp )
target_link_libraries( test ${CMAKE_THREAD_LIBS_INIT} )
le module Threads dans les dernières versions (>= 3.1) de CMake génère le Threads::Threads imported target . Lier votre cible avec des Threads::Threads ajoute tous les drapeaux de compilation et de lien nécessaires. Cela peut se faire 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 le CMake docs
Que Diriez-vous de ce qui suit:
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} )