0

Ошибка сборки с использованием cmake: невозможно найти -lpthreads

14

У меня есть проект на C++, который без проблем работал на одной машине, и сейчас я пытаюсь его скомпилировать на другой с такой же операционной системой (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_CXX_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")

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

  • использовал -pthread, -threads, -thread вместо -lpthread, но это не решило проблему и сборка остановилась на этапе поиска следующего пакета:
find_package(Threads)
  • изменил порядок -lpthread в строках CMake, но это дало ту же ошибку
  • пробовал разные версии 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 pthread_create@@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)
  ...
  CHECK_LIB أنا pthread pthread_create "" CMAKE_HAVE_PTHREAD_CREATE)
  ...
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 

Буду благодарен за любые советы и помощи в решении этой проблемы!

5 ответ(ов)

0

Проблема возникала при запуске cmake. Однако в данном случае самой причиной был не cmake, а ошибка была молчалива, и единственным сообщением, записанным в журнал ошибок cmake, было предупреждение об ошибке, связанном с -lpthreads, хотя это не вызывало никаких проблем.

Я создал минимальную версию CMakeLists.txt и начал тестировать его построчно, пока не обнаружил, какой пакет вызывал остановку: в итоге оказалось, что это несовпадение версий...

Подсказка: ищите фактическое сообщение об ошибке

Обычно вы бы искали последнее сообщение об ошибке. Однако эта (часто полезная) стратегия в таких случаях может запутать.

Вам стоит обратить внимание на файлы CMakeCache.txt, CMakeOutput.log или CMakeError.log. Почему так? Когда некоторые макросы или тесты на этапе конфигурации завершаются неудачей, CMake «доброжелательно» сбрасывает эти файлы в вывод. К сожалению, эти файлы могут содержать тысячи строк и в значительной степени содержат множество записей *** Error: xyz для различных проверок конфигурации. Данная запись для -lpthreads случайно оказалась последней в журнале...

Решение: просмотрите журнал с верха, определите раздел с проверками конфигурации и найдите последнюю проверку конфигурации перед тем местом, где CMake указывает на ошибку и сбрасывает свои журналы. Вы также можете попробовать поискать текст Configuring incomplete, errors occurred!.

В большинстве случаев вы либо найдете очень точное фактическое сообщение об ошибке, либо, по крайней мере, обнаружите имя / путь последнего вызванного макроса или функции, что позволит вам точно определить, что именно пошло не так.

0

На Ubuntu 18.04.1 LTS установка, указанная ниже, предоставила все необходимые файлы:

apt -y install libboost-tools-dev libboost-thread1.62-dev magics++

После этого у меня больше не возникало ошибок типа "/usr/bin/ld: cannot find -lpthreads":

/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

Таким образом, установка библиотек libboost и magics++ решает проблему с отсутствием библиотеки pthread.

0

Правка 1:

Все ссылки ниже относятся к 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 pthread_create@@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 
0

Судя по всему, это давно известная ошибка CMake. Похоже, что что-то идёт не так, CMake путается и сообщает об этой ложной проблеме вместо реальной ошибки.

Попробуйте поискать слово "thread" в вашем файле CMakeLists.txt и временно удалите его.

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

0

На Ubuntu 18.04 я решил проблему следующим образом:

$ sudo apt-get install libboost-all-dev
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь