2009-10-25 18 views
114

Sono in esecuzione RHEL 5.1 e uso gcc.cmake e libpthread

Come dico a cmake per aggiungere -pthread alla compilazione e al collegamento?

+1

Puoi scegliere una risposta per questo? –

+1

Amico, devi scegliere @ Manuel come risposta. –

+0

@Ehsan thehouse's answer is way better! :-) – Ela782

risposta

11

Ecco l'anwser destra:

ADD_EXECUTABLE(your_executable ${source_files}) 

TARGET_LINK_LIBRARIES(your_executable 
pthread 
) 

equivalente a

-lpthread 
+0

Questo è equivalente. "-pthread" dona molto di più - alla compilazione è -D_REENTRANT, al link time -lpthread. Su alcuni sistemi persino può essere più di questo. – dimba

+1

SET (CMAKE_CXX_FLAGS_DEBUG "... -lpthread") SET (CMAKE_CXX_FLAGS_RELEASE "... -lpthread") –

+0

Mi sento come se questa risposta rispondesse direttamente alla domanda. Concordo sul fatto che l'utilizzo del modulo Trova discussioni sia più portabile, ma non è quello che è stato chiesto. – JonnyRo

151

Il seguente dovrebbe essere pulita (utilizzando find_package) e il lavoro (il modulo di ritrovamento si chiama 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 CXX solo. Qualcuno sa una soluzione piacevole? – Simon

+1

@Simon un po 'in ritardo, ma per favore vedi questo: http://stackoverflow.com/questions/15193785/how-to-get-cmake-to-recognize-pthread-on-ubuntu – congusbongus

+0

@CongXu Grazie! Buono a sapersi! – Simon

85

@Manuel era in parte lì. È possibile aggiungere l'opzione del compilatore, così, in questo modo:

Se avete CMake 3.1.0+, this becomes even easier:

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

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

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

versioni più vecchio CMake possono 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 i primi due metodi con CMake 3.1+, avrete bisogno anche di set(THREADS_PREFER_PTHREAD_FLAG ON).

+0

Sembra ad es. CMake 3.0.2 non imposterà THREADS_HAVE_PTHREAD_ARG se è stata trovata la libreria pthread ('NOT CMAKE_HAVE_THREADS_LIBRARY'), ad es. su Ubuntu 15.04 :( – mlt

+5

Questa dovrebbe essere la risposta accettata – csl

+1

La versione fornita per CMake 2.8.12+ non funzionerà come previsto, a causa di come funziona il codice in /usr/share/cmake-2.8/Modules/FindThreads .cmake' (ad esempio, vedere qui https://www.apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/2.8.12.2-0ubuntu3/file/usr/share/cmake-2.8/Modules/FindThreads.cmake) Fondamentalmente, 'THREADS_HAVE_PTHREAD_ARG' viene impostato solo se non sono state trovate le altre varianti della bandiera (es.' -lpthread', ' -lpthread', o '-lthread') – j1elo