Ошибка построения с помощью 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
Ответы
Ответ 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