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):
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.
Respuestas:
@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 :
Si está utilizando CMake 2.8.12+, puede simplificar esto para:
Las versiones anteriores de CMake pueden requerir:
Si desea utilizar uno de los dos primeros métodos con CMake 3.1+, también lo necesitará
set(THREADS_PREFER_PTHREAD_FLAG ON)
.fuente
NOT CMAKE_HAVE_THREADS_LIBRARY
), por ejemplo, en Ubuntu 15.04 :(/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_ARG
sólo se establece si las otras variaciones de la bandera no se encontraron (es decir.-lpthread
,-lpthread
, o-lthread
)Lo siguiente debe estar limpio (usando
find_package
) y funcionar (se llama al módulo de búsquedaFindThreads
):fuente
Aquí está la respuesta correcta:
equivalente a
fuente
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.