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?
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?
Aquí es el anwser derecha:
ADD_EXECUTABLE(your_executable ${source_files})
TARGET_LINK_LIBRARIES(your_executable
pthread
)
equivalente a
-lpthread
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
SET (CMAKE_CXX_FLAGS_DEBUG "... -lpthread") SET (CMAKE_CXX_FLAGS_RELEASE "... -lpthread") –
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
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})
Esto no funciona cuando se usa en un proyecto solo CXX. ¿Alguien sabe una buena solución? – Simon
@Simon un poco tarde, pero vea esto: http://stackoverflow.com/questions/15193785/how-to-get-cmake-to-recognize-pthread-on-ubuntu – congusbongus
@CongXu ¡Gracias! ¡Bueno saber! – Simon
@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)
.
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
Esta debería ser la respuesta aceptada. – csl
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
¿Puedes elegir una respuesta para esto? –
Amigo, tienes que elegir @ Manuel como la respuesta. –
¡La respuesta de @Ehsan thehouse es mucho mejor! :-) – Ela782