Подтвердить что ты не робот

Ошибка построения с помощью cmake: не удается найти -lpthreads

У меня есть проект С++, который был плавно запущен на данной машине, и теперь я пытаюсь скомпилировать его на другой с той же операционной системой (Xubuntu 14.04).

Я установил все зависимости и использую cmake для создания проекта, хотя он останавливается со следующей ошибкой:

Определение того, существует ли функция pthread_create в pthreads неудачно со следующим выходом:   ...   /usr/bin/ld: не удается найти -lpthreads

Строки cmakelists.txt, содержащие флаги компилятора, следующие:

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")

Я провел некоторое исследование и уже пробовал следующее:

-used -pthread/-threads/-thread/-lpthreads вместо -lpthread, что не решает проблему и останавливает сборку без нахождения следующего пакета: find_package (Threads)

  • изменил порядок -lpthread в строке cmakelists выше, что дает ту же ошибку
  • использовали разные версии o gcc/g++: попробовали 4.4, 4.6 и 4.8 без каких-либо изменений.
  • создала символическую ссылку на libpthread.so в/usr/lib/без каких-либо изменений.

Я был бы признателен за некоторую помощь, так как я уже немного разбираюсь в том, что делать дальше.

Изменить 1

В библиотеке должно быть:

$ find /lib -name "*pthread*"
/lib/x86_64-linux-gnu/libpthread-2.19.so
/lib/x86_64-linux-gnu/libpthread.so.0

Также найден pthread_create:

$ nm /lib/x86_64-linux-gnu/libpthread.so.0 | grep "pthread_create"
0000000000008430 t __pthread_create_2_1
00000000000081430 T [email protected]@GLIBC_2.2.5

Я также подтвердил, что присутствуют как libpthread-stubs0, так и libc6-dev.

Изменить 2

Это часть содержимого файла FindThreads.cmake, расположенного в /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 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()

Изменить 3

Используется минимальный файл Cmakelists.txt следующим образом:

cmake_minimum_required (VERSION 2.4)
find_package(Threads)

Что вызвало следующий вывод:

-- 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 
4b9b3361

Ответ 1

на Ubuntu 18.04.1 LTS эта установка дала мне все необходимые файлы:

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

больше нет ошибок "/usr/bin/ld: не удается найти -lpthreads" после

Ответ 2

Edit1:

Все ссылки ниже приведены для Ubuntu.

Пакет с именем libpthread-stubs0 скорее всего будет только заглушкой, поэтому не будет иметь функции pthread_create.

У вас есть это?

$ find /lib -name "*pthread*"
/lib/x86_64-linux-gnu/libpthread-2.15.so
/lib/x86_64-linux-gnu/libpthread.so.0

Проверьте символ pthread_create, который должен существовать.

$ nm /lib/x86_64-linux-gnu/libpthread.so.0 | grep "pthread_create"
0000000000008140 t __pthread_create_2_1
0000000000008140 T [email protected]@GLIBC_2.2.5

Если это не сработает, вам может понадобиться версия dev pthread, которая находится в libc6-dev. Вы можете найти содержимое пакета с libpthread.so в http://packages.ubuntu.com/.

Примечание. Кроме того, он не работает на -lpthreads. Должен ли он быть -lpthread вместо (без s)?

Изменить 2

Создайте простой CMakeLists.txt со следующими и запустите cmake.

cmake_minimum_required (VERSION 2.8.7)
find_package(Threads)

Какой результат? Находит ли он pthread?

Мой вывод:

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

Ответ 3

Это похоже на давнюю ошибку CMake. Что-то еще идет не так, CMake сбивается с толку и сообщает об этой ложной проблеме вместо реальной ошибки.

Найдите "поток" в вашем файле CMakeLists.txt и временно удалите его.

В моем случае это сразу определило библиотеку (или, скорее, ее пакет разработки), которая отсутствовала. Установил, добавил в debian/control Build-Depends: раздел, перекомпилировал, все заработало.

Ответ 4

Пожалуйста, попробуйте установить одну зависимость glibc-static

В Ubuntu вы можете попробовать apt-get install build-essential

На других Linux вы можете установить пакет, аналогичный glibc-static.

Ответ 5

на Ubuntu 18.04 я решил, как показано ниже.

$ sudo apt-get install libboost-all-dev