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):
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.
Réponses:
@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 :
Si vous utilisez CMake 2.8.12+, vous pouvez simplifier cela pour:
Les anciennes versions de CMake peuvent nécessiter:
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 source
NOT CMAKE_HAVE_THREADS_LIBRARY
), par exemple sur Ubuntu 15.04 :(/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_ARG
sert uniquement si les autres variations du drapeau sont introuvables (ie.-lpthread
,-lpthread
ou-lthread
)Les éléments suivants doivent être propres (en utilisant
find_package
) et fonctionner (le module de recherche est appeléFindThreads
):la source
Voici la bonne réponse:
équivalent à
la source
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.