cmake und libpthread


187

Ich renne RHEL 5.1und benutze gcc.

Wie kann ich der Zusammenstellung und Verknüpfung cmakehinzufügen -pthread?


1
Können Sie eine Antwort darauf wählen?
Jared Burrows

1
Alter, du musst @ Manuel's als Antwort wählen.

@Ehsan thehouse Antwort ist viel besser! :-)
Ela782

Antworten:


205

@ 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 :

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

Wenn Sie CMake 2.8.12+ verwenden, können Sie dies vereinfachen, um:

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()

Ältere CMake-Versionen erfordern möglicherweise:

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()

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.


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):

cmake_minimum_required (VERSION 2.6) 
find_package (Threads)
add_executable (myapp main.cpp ...)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})

2
Dies funktioniert nicht, wenn Sie es nur in einem CXX-Projekt verwenden. Kennt jemand eine gute Problemumgehung?
Simon

1
@ Simon etwas spät, aber bitte sehen Sie dies: stackoverflow.com/questions/15193785/…
congusbongus

@CongXu Danke! Gut zu wissen!
Simon

1
Diese Lösung funktioniert unter Mac OS X, Centos 6 und Solaris 10.
bernardn

1
Beachten Sie, dass dadurch das Compiler-Flag -pthread
mlt

25

Hier ist die richtige Antwort:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)

gleichwertig

-lpthread

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.
Ela782
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.