web-dev-qa-db-fra.com

Erreur de construction à l'aide de cmake: impossible de trouver -lpthreads

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)

  • changé l'ordre de -lpthread dans la ligne cmakelists ci-dessus, ce qui donne la même erreur
  • utilisé différentes versions de gcc/g ++: essayé 4.4, 4.6 et 4.8, sans aucun changement
  • créé un lien symbolique vers libpthread.so dans/usr/lib /, sans aucune modification

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 
23
Sapiens

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 ...

0
Sapiens

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

4
fometeo

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 
1
ap-osd

sur ubuntu 18.04 j'ai résolu comme ci-dessous.

$ Sudo apt-get install libboost-all-dev
0
Paul Go

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)

0
kaios

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.

0
Matthias Urlichs

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.

0
Aditya Pawaskar