Es scheint, als würde z. B. CMake 3.0.2 THREADS_HAVE_PTHREAD_ARG nicht setzen, wenn eine pthread-Bibliothek gefunden wurde ( NOT CMAKE_HAVE_THREADS_LIBRARY), z. B. unter Ubuntu 15.04 :(
mlt
1
Die für CMake 2.8.12+ angegebene Version funktioniert aufgrund der Funktionsweise des Codes nicht wie vorgesehen /usr/share/cmake-2.8/Modules/FindThreads.cmake(siehe z. B. hier apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/… ). grundsätzlich THREADS_HAVE_PTHREAD_ARGwird nur gesetzt , wenn die anderen Varianten des flag nicht gefunden wurden (dh. -lpthread, -lpthread, oder -lthread)
j1elo
Dies gibt den Fehler "Linkbibliotheken für Ziel" my_app ", das nicht von diesem Projekt erstellt wurde, können nicht angegeben werden." - Wie können Sie es universell aktivieren, ohne es für jedes Ziel einzeln ausführen zu müssen?
Chris Dodd
Ist der erste noch der einfachste Weg im Jahr 2020 / cmake 3.17?
Jay
Was passiert, wenn Sie das Flag THREADS_PREFER_PTHREAD_FLAG nicht setzen, sondern nur suchen und verknüpfen?
Jay
199
Folgendes sollte sauber sein (verwenden find_package) und funktionieren (das Suchmodul heißt FindThreads):
Das ist gleichwertig. "-pthread" spendet viel mehr - bei der Kompilierung ist es -D_REENTRANT, zur Linkzeit -lpthread. Auf einigen Systemen kann sogar mehr sein.
Dimba
2
SET (CMAKE_CXX_FLAGS_DEBUG "... -lpthread") SET (CMAKE_CXX_FLAGS_RELEASE "... -lpthread")
Nadir SOUALEM
21
Diese Lösung wird blockiert, sobald Sie von Linux zu Freebsd oder Windows wechseln.
Alex
4
Funktioniert nicht, "target_link_libraries (your_executable pthread)" sollte so geschrieben werden.
Overv
6
Dies ist keineswegs die richtige Antwort. Auch wenn Ihnen die Antwort des Hauses nicht gefällt und wenn man bedenkt, dass sie 2009 geschrieben wurde, ist sie völlig plattformübergreifend. Verwenden Sie die Antwort des Hauses - und wenn es Ihnen nicht gefällt, entscheiden Sie sich für etwas, target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")das zumindest zielbasiert ist und auf Windows und anderen Plattformen nicht fehlschlägt.
Antworten:
@ Manuel war auf halbem Weg da. Sie können die Compiler-Option auch wie folgt hinzufügen:
Wenn Sie CMake 3.1.0+ haben, wird dies noch einfacher :
Wenn Sie CMake 2.8.12+ verwenden, können Sie dies vereinfachen, um:
Ältere CMake-Versionen erfordern möglicherweise:
Wenn Sie eine der ersten beiden Methoden mit CMake 3.1+ verwenden möchten, benötigen Sie diese
set(THREADS_PREFER_PTHREAD_FLAG ON)
ebenfalls.quelle
NOT CMAKE_HAVE_THREADS_LIBRARY
), z. B. unter Ubuntu 15.04 :(/usr/share/cmake-2.8/Modules/FindThreads.cmake
(siehe z. B. hier apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/… ). grundsätzlichTHREADS_HAVE_PTHREAD_ARG
wird nur gesetzt , wenn die anderen Varianten des flag nicht gefunden wurden (dh.-lpthread
,-lpthread
, oder-lthread
)Folgendes sollte sauber sein (verwenden
find_package
) und funktionieren (das Suchmodul heißtFindThreads
):quelle
Hier ist die richtige Antwort:
gleichwertig
quelle
target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")
das zumindest zielbasiert ist und auf Windows und anderen Plattformen nicht fehlschlägt.