cmake e libpthread


188

Sto correndo RHEL 5.1e uso gcc.

Come dico cmakedi aggiungere -pthreadalla compilazione e al collegamento?


1
Puoi scegliere una risposta per questo?
Jared Burrows,

1
Amico, devi scegliere @ Manuel come risposta.

La risposta di @Ehsan thehouse è molto meglio! :-)
Ela782,

Risposte:


208

@Manuel era in parte lì. Puoi anche aggiungere l'opzione del compilatore, in questo modo:

Se hai CMake 3.1.0+, questo diventa ancora più semplice :

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

Se si utilizza CMake 2.8.12+, è possibile semplificare questo per:

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

Le versioni precedenti di CMake potrebbero richiedere:

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

Se si desidera utilizzare uno dei primi due metodi con CMake 3.1+, è necessario set(THREADS_PREFER_PTHREAD_FLAG ON)anche lì.


Sembra che ad esempio CMake 3.0.2 non imposti THREADS_HAVE_PTHREAD_ARG se viene trovata la libreria pthread ( NOT CMAKE_HAVE_THREADS_LIBRARY), ad esempio su Ubuntu 15.04 :(
mlt

1
La versione fornita per CMake 2.8.12+ non funzionerà come previsto, a causa di come funziona il codice /usr/share/cmake-2.8/Modules/FindThreads.cmake(ad es. Vedi qui apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/… ) fondamentalmente, THREADS_HAVE_PTHREAD_ARGviene impostato solo se le altre varianti della bandiera non sono stati trovati (es. -lpthread, -lpthread, o -lthread)
j1elo

Ciò genera l'errore "Impossibile specificare le librerie di collegamenti per la destinazione" my_app "che non è stato creato da questo progetto." - come lo abiliti universalmente senza doverlo fare individualmente per ogni target?
Chris Dodd,

Il primo è ancora il modo più semplice nel 2020 / cmake 3.17?
Jay,

Cosa succede se non imposti il ​​flag THREADS_PREFER_PTHREAD_FLAG, trovi e collega?
Jay,

199

Quanto segue dovrebbe essere pulito (usando find_package) e funzionare (si chiama il modulo find FindThreads):

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

2
Questo non funziona quando si utilizza in un progetto solo CXX. Qualcuno conosce una bella soluzione?
Simon,

1
@Simon un po 'tardi, ma si prega di vedere questo: stackoverflow.com/questions/15193785/...
congusbongus

@CongXu Grazie! Buono a sapersi!
Simon

1
Questa soluzione funziona su Mac OS X, Centos 6 e Solaris 10.
bernardn


26

Ecco la risposta giusta:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)

equivalente a

-lpthread

Questo è equivalente. "-pthread" dona molto di più - alla compilazione è -D_REENTRANT, al momento del collegamento -lpthread. Su alcuni sistemi anche può essere più di questo.
dimba,

2
SET (CMAKE_CXX_FLAGS_DEBUG "... -lpthread") SET (CMAKE_CXX_FLAGS_RELEASE "... -lpthread")
Nadir SOUALEM

21
questa soluzione si trasforma non appena si passa da Linux a FreeBSD o Windows.
Alex

4
Non funziona, "target_link_libraries (your_executable pthread)" è come dovrebbe essere scritto.
Overv il

6
Questa non è la risposta giusta in alcun modo. Anche se non ti piace la risposta di thehouse, e considerando che questa è stata scritta nel 2009, è una piattaforma completamente non incrociata. Usa la risposta di thehouse - e se non ti piace, cerca qualcosa di simile target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")che è almeno basato su target e non fallisce su Windows e altre piattaforme.
Ela782,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.