Ошибка сборки с использованием cmake: невозможно найти -lpthreads
У меня есть проект на 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 ответ(ов)
Проблема возникала при запуске cmake. Однако в данном случае самой причиной был не cmake, а ошибка была молчалива, и единственным сообщением, записанным в журнал ошибок cmake, было предупреждение об ошибке, связанном с -lpthreads
, хотя это не вызывало никаких проблем.
Я создал минимальную версию CMakeLists.txt
и начал тестировать его построчно, пока не обнаружил, какой пакет вызывал остановку: в итоге оказалось, что это несовпадение версий...
Подсказка: ищите фактическое сообщение об ошибке
Обычно вы бы искали последнее сообщение об ошибке. Однако эта (часто полезная) стратегия в таких случаях может запутать.
Вам стоит обратить внимание на файлы CMakeCache.txt
, CMakeOutput.log
или CMakeError.log
. Почему так? Когда некоторые макросы или тесты на этапе конфигурации завершаются неудачей, CMake «доброжелательно» сбрасывает эти файлы в вывод. К сожалению, эти файлы могут содержать тысячи строк и в значительной степени содержат множество записей *** Error: xyz
для различных проверок конфигурации. Данная запись для -lpthreads
случайно оказалась последней в журнале...
Решение: просмотрите журнал с верха, определите раздел с проверками конфигурации и найдите последнюю проверку конфигурации перед тем местом, где CMake указывает на ошибку и сбрасывает свои журналы. Вы также можете попробовать поискать текст Configuring incomplete, errors occurred!
.
В большинстве случаев вы либо найдете очень точное фактическое сообщение об ошибке, либо, по крайней мере, обнаружите имя / путь последнего вызванного макроса или функции, что позволит вам точно определить, что именно пошло не так.
На 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.
Правка 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
Судя по всему, это давно известная ошибка CMake. Похоже, что что-то идёт не так, CMake путается и сообщает об этой ложной проблеме вместо реальной ошибки.
Попробуйте поискать слово "thread" в вашем файле CMakeLists.txt и временно удалите его.
В моем случае это сразу помогло выявить библиотеку (а точнее, пакет для разработки), которая отсутствовала. Установил её, добавил в секцию Build-Depends:
файла debian/control
, перекомпилировал - и всё заработало.
На Ubuntu 18.04 я решил проблему следующим образом:
$ sudo apt-get install libboost-all-dev
Как изменить цвет вывода echo в Linux
Сон на миллисекунды
Отладка против Релиза в CMake
Разница между использованием Makefile и CMake для компиляции кода?
Ошибка: версия `CXXABI_1.3.8` не найдена (требуется для ...)