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.

28

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} )
40
répondu ltc 2011-03-23 08:33:45

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

18
répondu Alex Che 2016-09-17 13:50:24

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} )
6
répondu user3701085 2014-06-02 22:52:39