cmake et libpthread

201

Je cours RHEL 5.1et j'utilise gcc.

Comment dire cmaked'ajouter -pthreadà la compilation et aux liens?

dimba
la source
1
Pouvez-vous choisir une réponse à cela?
Jared Burrows
1
Mec, tu dois choisir @ Manuel comme réponse.
La réponse de @Ehsan thehouse est bien meilleure! :-)
Ela782

Réponses:

221

@Manuel était à mi-chemin. Vous pouvez également ajouter l'option du compilateur, comme ceci:

Si vous avez CMake 3.1.0+, cela devient encore plus facile :

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(my_app PRIVATE Threads::Threads)

Si vous utilisez CMake 2.8.12+, vous pouvez simplifier cela pour:

find_package(Threads REQUIRED)
if(THREADS_HAVE_PTHREAD_ARG)
  target_compile_options(my_app PUBLIC "-pthread")
endif()
if(CMAKE_THREAD_LIBS_INIT)
  target_link_libraries(my_app "${CMAKE_THREAD_LIBS_INIT}")
endif()

Les anciennes versions de CMake peuvent nécessiter:

find_package(Threads REQUIRED)
if(THREADS_HAVE_PTHREAD_ARG)
  set_property(TARGET my_app PROPERTY COMPILE_OPTIONS "-pthread")
  set_property(TARGET my_app PROPERTY INTERFACE_COMPILE_OPTIONS "-pthread")
endif()
if(CMAKE_THREAD_LIBS_INIT)
  target_link_libraries(my_app "${CMAKE_THREAD_LIBS_INIT}")
endif()

Si vous souhaitez utiliser l'une des deux premières méthodes avec CMake 3.1+, vous en aurez également besoin set(THREADS_PREFER_PTHREAD_FLAG ON).

la maison
la source
Il semble par exemple que CMake 3.0.2 ne définira pas THREADS_HAVE_PTHREAD_ARG si la bibliothèque pthread a été trouvée ( NOT CMAKE_HAVE_THREADS_LIBRARY), par exemple sur Ubuntu 15.04 :(
mlt
1
La version donnée pour CMake 2.8.12+ ne fonctionnera pas comme prévu, en raison de la façon dont le code fonctionne /usr/share/cmake-2.8/Modules/FindThreads.cmake(par exemple, voir ici apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/… ) au fond, THREADS_HAVE_PTHREAD_ARGsert uniquement si les autres variations du drapeau sont introuvables (ie. -lpthread, -lpthreadou -lthread)
j1elo
Cela donne l'erreur "Impossible de spécifier les bibliothèques de liens pour la cible" my_app "qui n'est pas construite par ce projet." - comment l'activer universellement sans avoir à le faire individuellement pour chaque cible?
Chris Dodd
Le premier est-il toujours le moyen le plus simple en 2020 / cmake 3.17?
Jay
Que se passe-t-il si vous ne définissez pas l'indicateur THREADS_PREFER_PTHREAD_FLAG, recherchez et liez simplement?
Jay
204

Les éléments suivants doivent être propres (en utilisant find_package) et fonctionner (le module de recherche est appelé FindThreads):

cmake_minimum_required (VERSION 2.6) 
find_package (Threads)
add_executable (myapp main.cpp ...)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})
Manuel
la source
2
Cela ne fonctionne pas lors de l'utilisation dans un projet CXX uniquement. Quelqu'un connaît-il une belle solution de contournement?
Simon
1
@Simon un peu en retard mais s'il vous plaît voir ceci: stackoverflow.com/questions/15193785/…
congusbongus
@CongXu Merci! Bon à savoir!
Simon
1
Cette solution fonctionne sous Mac OS X, Centos 6 et Solaris 10.
bernardn
1
Notez que cela ne définira
-pthread
25

Voici la bonne réponse:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)

équivalent à

-lpthread
Nadir SOUALEM
la source
C'est équivalent. "-pthread" donne beaucoup plus - à la compilation, c'est -D_REENTRANT, au moment du lien -lpthread. Sur certains systèmes, même peut être plus que cela.
dimba
2
SET (CMAKE_CXX_FLAGS_DEBUG "... -lpthread") SET (CMAKE_CXX_FLAGS_RELEASE "... -lpthread")
Nadir SOUALEM
22
cette solution se concrétise dès que vous passez de Linux à FreeBSD ou Windows.
Alex
4
Ne fonctionne pas, "target_link_libraries (your_executable pthread)" est la façon dont il devrait être écrit.
Overv du
7
Ce n’est en aucun cas la bonne réponse. Même si vous n'aimez pas la réponse de la maison, et considérant que cela a été écrit en 2009, c'est complètement non multiplateforme. Utilisez la réponse de la maison - et si vous ne l'aimez pas, optez pour quelque chose comme target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")qui est au moins basé sur la cible et n'échoue pas sur Windows et d'autres plates-formes.
Ela782 du