cmake y libpthread

188

Estoy corriendo RHEL 5.1 y uso gcc.

¿Cómo le digo cmakeque agregue -pthreada la compilación y la vinculación?

dimba
fuente
1
¿Puedes elegir una respuesta para esto?
Jared Burrows,
1
Amigo, tienes que elegir @ Manuel's como respuesta.
¡La respuesta de @Ehsan thehouse es mucho mejor! :-)
Ela782

Respuestas:

208

@Manuel estaba a medio camino allí. También puede agregar la opción del compilador, así:

Si tiene CMake 3.1.0+, esto se vuelve aún más fácil :

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

Si está utilizando CMake 2.8.12+, puede simplificar esto para:

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 de CMake pueden requerir:

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 uno de los dos primeros métodos con CMake 3.1+, también lo necesitará set(THREADS_PREFER_PTHREAD_FLAG ON).

la casa
fuente
Parece que, por ejemplo, CMake 3.0.2 no establecerá THREADS_HAVE_PTHREAD_ARG si se encontró la biblioteca pthread ( NOT CMAKE_HAVE_THREADS_LIBRARY), por ejemplo, en Ubuntu 15.04 :(
mlt
1
La versión dada para CMake 2.8.12+ no funcionará según lo previsto, debido a cómo funciona el código /usr/share/cmake-2.8/Modules/FindThreads.cmake(por ejemplo, vea aquí apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/… ) básicamente, THREADS_HAVE_PTHREAD_ARGsólo se establece si las otras variaciones de la bandera no se encontraron (es decir. -lpthread, -lpthread, o -lthread)
j1elo
Esto da el error "No se pueden especificar bibliotecas de enlaces para el destino" my_app "que no está construido por este proyecto". - ¿Cómo se habilita universalmente sin tener que hacerlo individualmente para cada objetivo?
Chris Dodd
¿Es la primera forma más fácil en 2020 / cmake 3.17?
Jay
¿Qué sucede si no establece la bandera THREADS_PREFER_PTHREAD_FLAG, solo busque y vincule?
Jay
199

Lo siguiente debe estar limpio (usando find_package) y funcionar (se llama al módulo de búsqueda FindThreads):

cmake_minimum_required (VERSION 2.6) 
find_package (Threads)
add_executable (myapp main.cpp ...)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})
Manuel
fuente
2
Esto no funciona cuando se usa en un solo proyecto CXX. ¿Alguien sabe una buena solución?
Simon
1
@Simon un poco tarde pero mira esto: stackoverflow.com/questions/15193785/…
congusbongus
@CongXu Gracias! ¡Bueno saber!
Simon
1
Esta solución funciona con Mac OS X, Centos 6 y Solaris 10.
bernardn
1
Tenga en cuenta que esto no establecerá el indicador del compilador
-pthread
26

Aquí está la respuesta correcta:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)

equivalente a

-lpthread
Nadir SOUALEM
fuente
Esto es equivalente "-pthread" dona mucho más: en la compilación es -D_REENTRANT, en el momento del enlace -lpthread. En algunos sistemas, incluso puede ser más que esto.
dimba 01 de
2
SET (CMAKE_CXX_FLAGS_DEBUG "... -lpthread") SET (CMAKE_CXX_FLAGS_RELEASE "... -lpthread")
Nadir SOUALEM
21
esta solución funciona tan pronto como cambie de linux a freebsd o windows.
Alex
44
No funciona, "target_link_libraries (your_executable pthread)" es cómo debe escribirse.
Overv
66
Esta no es la respuesta correcta de ninguna manera. Incluso si no le gusta la respuesta de thehouse, y teniendo en cuenta que esto fue escrito en 2009, es completamente no multiplataforma. Use la respuesta de thehouse, y si no le gusta, elija algo target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")que esté al menos basado en objetivos y que no falle en Windows y otras plataformas.
Ela782