J'ai un projet c ++ qui fonctionnait bien sur une machine donnée, et maintenant j'essaye de le compiler sur une autre avec le même système d'exploitation (Xubuntu 14.04).
J'ai installé toutes les dépendances et j'utilise cmake pour construire le projet, bien qu'il s'arrête avec l'erreur suivante:
Échec de la détermination de la fonction pthread_create dans les pthreads avec la sortie suivante: .../usr/bin/ld: impossible de trouver -lpthreads
Les lignes cmakelists.txt qui incluent les drapeaux du compilateur sont les suivantes:
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")
J'ai fait quelques recherches et j'ai déjà essayé ce qui suit:
-used -pthread/-threads/-thread/-lpthreads au lieu de -lpthread, ce qui ne résout pas le problème et arrête la génération sans trouver le package suivant: find_package (Threads)
J'apprécierais de l'aide, car je suis déjà à court d'idées sur ce qu'il faut essayer ensuite.
Modifier 1
La bibliothèque est là où elle devrait:
$ find /lib -name "*pthread*"
/lib/x86_64-linux-gnu/libpthread-2.19.so
/lib/x86_64-linux-gnu/libpthread.so.0
Le pthread_create se trouve également:
$ 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
J'ai également vérifié que libpthread-stubs et libc6-dev sont présents.
Modifier 2
Cela fait partie du contenu du fichier FindThreads.cmake, situé dans /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()
Modifier
Utilisé un Cmakelists.txt minimal comme suit:
cmake_minimum_required (VERSION 2.4)
find_package(Threads)
Qui a produit la sortie suivante:
-- 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
Le problème se produisait lors de l'exécution de cmake. Cependant, dans ce cas, cmake n'était pas le problème, l'erreur était silencieuse et l'erreur/l'avertissement lié à -lpthreads était la seule chose écrite dans le fichier journal des erreurs cmake, même si cela ne posait aucun problème. J'ai fait une version minimale du cmakelists.txt et j'ai commencé à le tester ligne par ligne jusqu'à ce que je trouve quel paquet provoquait son arrêt: enfin j'ai trouvé que c'était une incompatibilité de version ...
sur un Ubuntu 18.04.1 LTS, cette installation m'a donné tous les fichiers nécessaires:
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
plus d'erreurs "/ usr/bin/ld: impossible de trouver -lpthreads" après
Edit1:
Toutes les références ci-dessous concernent Ubuntu.
Package nommé libpthread-stubs0
n'est probablement qu'un talon, donc il n'aura pas le pthread_create
une fonction.
Avez-vous ce?
$ find /lib -name "*pthread*"
/lib/x86_64-linux-gnu/libpthread-2.15.so
/lib/x86_64-linux-gnu/libpthread.so.0
Vérifiez le symbole pthread_create
qui devrait exister.
$ 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 cela ne fonctionne pas, vous aurez peut-être besoin de la version dev de pthread
qui se trouve dans libc6-dev
. Vous pouvez rechercher le contenu du package qui a libpthread.so
dans http://packages.ubuntu.com/ .
Remarque: En outre, il échoue sur -lpthreads
. Devrait-ce être -lpthread
à la place (sans le s
)?
Édition 2
Créez un simple CMakeLists.txt
avec ce qui suit et exécutez cmake
.
cmake_minimum_required (VERSION 2.8.7)
find_package(Threads)
Quelle est la sortie? Trouve-t-il pthread
?
Ma sortie est:
-- 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
sur ubuntu 18.04 j'ai résolu comme ci-dessous.
$ Sudo apt-get install libboost-all-dev
J'ai eu exactement le même problème, avec le Cmakelists.txt minimal me donnant la même sortie. Pour résoudre ce problème, il suffit de mettre à niveau cmake vers dernière version (3.15 dans mon cas)
Cela semble être un bogue CMake de longue date. Quelque chose ne va pas, CMake est confus et signale ce faux problème au lieu de la véritable erreur.
Recherchez "thread" dans votre fichier CMakeLists.txt et supprimez-le temporairement.
Dans mon cas, cela a immédiatement identifié une bibliothèque (ou plutôt, son package de développement) qui manquait. Je l'ai installé, ajouté à debian/control
's Build-Depends:
section, recompilée, tout fonctionnait.
Veuillez essayer d'installer une dépendance glibc-static
Sur Ubuntu, vous pouvez essayer apt-get install build-essential
Sur un autre Linux, vous pouvez installer un package similaire à glibc-static
.