2009-10-25 8 views
114

Estoy ejecutando RHEL 5.1 y uso gcc.cmake y libpthread

¿Cómo digo cmake para agregar -pthread a la compilación y el enlace?

+1

¿Puedes elegir una respuesta para esto? –

+1

Amigo, tienes que elegir @ Manuel como la respuesta. –

+0

¡La respuesta de @Ehsan thehouse es mucho mejor! :-) – Ela782

Respuesta

11

Aquí es el anwser derecha:

ADD_EXECUTABLE(your_executable ${source_files}) 

TARGET_LINK_LIBRARIES(your_executable 
pthread 
) 

equivalente a

-lpthread 
+0

Esto es equivalente. "-pthread" dona mucho más, en la compilación es -D_REENTRANT, en tiempo de enlace -lpthread. En algún sistema, incluso, puede ser más que esto. – dimba

+1

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

+0

Siento que esta respuesta responde directamente la pregunta. Estoy de acuerdo en que el uso del módulo de búsqueda de Threads es más portátil, pero no es lo que se solicitó. – JonnyRo

151

Lo siguiente debe estar limpia (usando find_package) y el trabajo (módulo hallazgo se llama FindThreads):

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

Esto no funciona cuando se usa en un proyecto solo CXX. ¿Alguien sabe una buena solución? – Simon

+1

@Simon un poco tarde, pero vea esto: http://stackoverflow.com/questions/15193785/how-to-get-cmake-to-recognize-pthread-on-ubuntu – congusbongus

+0

@CongXu ¡Gracias! ¡Bueno saber! – Simon

85

@Manuel estuvo a mitad de camino. Puede agregar la opción de compilador, así, como este:

Si tiene 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) 

Si está usando CMake 2.8.12+, puede simplificar esto 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() 

Las versiones anteriores pueden requerir CRealice:

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

Si desea utilizar una de los primeros dos métodos con CMake 3.1+, también necesitará set(THREADS_PREFER_PTHREAD_FLAG ON).

+0

Parece que p. Ej. CMake 3.0.2 no configurará THREADS_HAVE_PTHREAD_ARG si se encontró la biblioteca pthread ('NOT CMAKE_HAVE_THREADS_LIBRARY'), p. en Ubuntu 15.04 :( – mlt

+5

Esta debería ser la respuesta aceptada. – csl

+1

La versión dada para CMake 2.8.12+ no funcionará según lo previsto, debido a cómo funciona el código en '/usr/share/cmake-2.8/Modules/FindThreads .cmake' (por ejemplo, ver aquí 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) Básicamente, 'THREADS_HAVE_PTHREAD_ARG' solo se establece si las otras variaciones de la bandera no se encontraron (es decir,' -lpthread', ' -lpthread', o '-lthread') – j1elo