c++ - guia - Error de construcción usando cmake: no se pueden encontrar-lpthreads
qgis español (4)
Tengo un proyecto c ++ que se ejecutó sin problemas en una máquina determinada, y ahora estoy tratando de compilarlo en otra con el mismo sistema operativo (Xubuntu 14.04).
He instalado todas las dependencias y estoy usando cmake para compilar el proyecto, aunque se detiene con el siguiente error:
La determinación de si la función pthread_create existe en pthreads falló con la siguiente salida: ... / usr / bin / ld: no se puede encontrar -lpthreads
Las líneas de cmakelists.txt que incluyen los indicadores del compilador son las siguientes:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -lpthread -DNDEBUG -DEIGEN_MPL2_ONLY")
set(CMAKE_C_FLAGS_DEBUG "-g -O0 -Wall -lpthread -DEIGEN_MPL2_ONLY")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -O3 -lpthread -I/usr/include/freetype2 -DNDEBUG -DEIGEN_MPL2_ONLY")
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -lpthread -I/usr/include/freetype2 -DEIGEN_MPL2_ONLY")
He investigado un poco y ya he probado lo siguiente:
-used -pthread / -threads / -thread / -lpthreads en lugar de -lpthread, que no resuelve el problema y hace que la compilación se detenga sin encontrar el siguiente paquete: find_package (Threads)
- cambió el orden de -lpthread en la línea cmakelists de arriba, lo que da el mismo error
- usé diferentes versiones de gcc / g ++: probé 4.4, 4.6 y 4.8, sin ningún cambio
- creó un enlace simbólico a libpthread.so en / usr / lib /, sin ningún cambio
Agradecería algo de ayuda, ya que me faltan ideas sobre qué intentar a continuación.
Editar 1
La biblioteca es donde debería:
$ find /lib -name "*pthread*"
/lib/x86_64-linux-gnu/libpthread-2.19.so
/lib/x86_64-linux-gnu/libpthread.so.0
El pthread_create también se encuentra:
$ nm /lib/x86_64-linux-gnu/libpthread.so.0 | grep "pthread_create"
0000000000008430 t __pthread_create_2_1
00000000000081430 T pthread_create@@GLIBC_2.2.5
También he verificado que tanto libpthread-stubs0 como libc6-dev están presentes.
Editar 2
Esto es parte del contenido del archivo FindThreads.cmake , ubicado en /usr/share/cmake-2.8/Modules/:
if(CMAKE_HAVE_SPROC_H AND NOT CMAKE_THREAD_PREFER_PTHREAD)
# We have sproc
set(CMAKE_USE_SPROC_INIT 1)
else()
# Do we have pthreads?
CHECK_INCLUDE_FILES("pthread.h" CMAKE_HAVE_PTHREAD_H)
if(CMAKE_HAVE_PTHREAD_H)
#
# We have pthread.h
# Let''s check for the library now.
#
set(CMAKE_HAVE_THREADS_LIBRARY)
if(NOT THREADS_HAVE_PTHREAD_ARG)
# Check if pthread functions are in normal C library
CHECK_SYMBOL_EXISTS(pthread_create pthread.h CMAKE_HAVE_LIBC_CREATE)
if(CMAKE_HAVE_LIBC_CREATE)
set(CMAKE_THREAD_LIBS_INIT "")
set(CMAKE_HAVE_THREADS_LIBRARY 1)
set(Threads_FOUND TRUE)
endif()
if(NOT CMAKE_HAVE_THREADS_LIBRARY)
# Do we have -lpthreads
CHECK_LIBRARY_EXISTS(pthreads pthread_create "" CMAKE_HAVE_PTHREADS_CREATE)
if(CMAKE_HAVE_PTHREADS_CREATE)
set(CMAKE_THREAD_LIBS_INIT "-lpthreads")
set(CMAKE_HAVE_THREADS_LIBRARY 1)
set(Threads_FOUND TRUE)
endif()
# Ok, how about -lpthread
CHECK_LIBRARY_EXISTS(pthread pthread_create "" CMAKE_HAVE_PTHREAD_CREATE)
if(CMAKE_HAVE_PTHREAD_CREATE)
set(CMAKE_THREAD_LIBS_INIT "-lpthread")
set(CMAKE_HAVE_THREADS_LIBRARY 1)
set(Threads_FOUND TRUE)
endif()
if(CMAKE_SYSTEM MATCHES "SunOS.*")
# On sun also check for -lthread
CHECK_LIBRARY_EXISTS(thread thr_create "" CMAKE_HAVE_THR_CREATE)
if(CMAKE_HAVE_THR_CREATE)
set(CMAKE_THREAD_LIBS_INIT "-lthread")
set(CMAKE_HAVE_THREADS_LIBRARY 1)
set(Threads_FOUND TRUE)
endif()
endif()
endif()
endif()
if(NOT CMAKE_HAVE_THREADS_LIBRARY)
# If we did not found -lpthread, -lpthread, or -lthread, look for -pthread
if("THREADS_HAVE_PTHREAD_ARG" MATCHES "^THREADS_HAVE_PTHREAD_ARG")
message(STATUS "Check if compiler accepts -pthread")
try_run(THREADS_PTHREAD_ARG THREADS_HAVE_PTHREAD_ARG
${CMAKE_BINARY_DIR}
${CMAKE_ROOT}/Modules/CheckForPthreads.c
CMAKE_FLAGS -DLINK_LIBRARIES:STRING=-pthread
COMPILE_OUTPUT_VARIABLE OUTPUT)
if(THREADS_HAVE_PTHREAD_ARG)
if(THREADS_PTHREAD_ARG STREQUAL "2")
set(Threads_FOUND TRUE)
message(STATUS "Check if compiler accepts -pthread - yes")
else()
message(STATUS "Check if compiler accepts -pthread - no")
file(APPEND
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Determining if compiler accepts -pthread returned ${THREADS_PTHREAD_ARG} instead of 2. The compiler had the following output:/n${OUTPUT}/n/n")
endif()
else()
message(STATUS "Check if compiler accepts -pthread - no")
file(APPEND
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Determining if compiler accepts -pthread failed with the following output:/n${OUTPUT}/n/n")
endif()
endif()
if(THREADS_HAVE_PTHREAD_ARG)
set(Threads_FOUND TRUE)
set(CMAKE_THREAD_LIBS_INIT "-pthread")
endif()
endif()
endif()
endif()
Editar 3
Se utiliza un mínimo de Cmakelists.txt de la siguiente manera:
cmake_minimum_required (VERSION 2.4)
find_package(Threads)
Lo que produjo el siguiente resultado:
-- Looking for include file pthread.h
-- Looking for include file pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found.
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
En mi caso, fue un error completamente falso, provocado por la extraña forma de invocar a cmake de Debian / Ubuntu.
Ejecutando "cmake". manualmente localizó una biblioteca (o, mejor dicho, su paquete de desarrollo) que faltaba. Se instaló, se agregó a la sección Build-Depends:
debian/control
Build-Depends:
recompilado, todo funcionó.
Por favor intente instalar una dependencia glibc-static
En Ubuntu puedes probar apt-get install build-essential
En otros linux puede instalar un paquete similar a glibc-static
.
en un Ubuntu 18.04.1 LTS esta instalación me dio todos los archivos necesarios:
apt -y install libboost-tools-dev libboost-thread1.62-dev magics++
/usr/lib/x86_64-linux-gnu/libpthread.a
/usr/lib/x86_64-linux-gnu/libpthread.so
/usr/lib/x86_64-linux-gnu/libpthread_nonshared.a
no hay más errores "/ usr / bin / ld: no puedo encontrar -lpthreads" después de
Edit1:
Todas las referencias a continuación son para Ubuntu.
El paquete llamado libpthread-stubs0
probablemente solo sea un código auxiliar, por lo que no tendrá la función pthread_create
.
¿Tienes esto?
$ find /lib -name "*pthread*"
/lib/x86_64-linux-gnu/libpthread-2.15.so
/lib/x86_64-linux-gnu/libpthread.so.0
Compruebe el símbolo pthread_create
que debería existir.
$ nm /lib/x86_64-linux-gnu/libpthread.so.0 | grep "pthread_create"
0000000000008140 t __pthread_create_2_1
0000000000008140 T pthread_create@@GLIBC_2.2.5
Si eso no funciona, es posible que necesites la versión dev de pthread
que está en libc6-dev
. Puede buscar el contenido del paquete que tiene libpthread.so
en http://packages.ubuntu.com/ .
Nota: Además, está fallando en -lpthreads
. ¿Debería ser -lpthread
lugar (sin las s
)?
Editar 2
Cree un CMakeLists.txt
simple con lo siguiente y ejecute cmake
.
cmake_minimum_required (VERSION 2.8.7)
find_package(Threads)
¿Cuál es la salida? ¿Encuentra pthread
?
Mi salida es:
-- Looking for include file pthread.h
-- Looking for include file pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found.
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE