我的c ++项目在给定的机器上运行顺畅,现在我正在尝试使用相同的操作系统(Xubuntu 14.04)在另一台机器上编译它。
我已经安装了所有依赖项,并且我正在使用cmake来构建项目,尽管它因以下错误而停止:
使用以下输出确定pthreads中是否存在pthread_create函数失败: ... / 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)
我很感激一些帮助,因为我已经很想知道下一步该尝试什么。
修改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)
# 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()
编辑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
答案 0 :(得分:4)
在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”
答案 1 :(得分:2)
我发现了造成我问题的原因。我最初使用cmake2做到了,但是项目需要cmake3。我将其更改为cmake3,但是它没有进行干净的构建,因此一些剩余的垃圾将所有内容弄乱了。当我清理所有东西并使用cmake3时,它起作用了。
答案 2 :(得分:1)
<强> 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 pthread_create@@GLIBC_2.2.5
如果这不起作用,您可能需要pthread
中的libc6-dev
开发版本。您可以搜索http://packages.ubuntu.com/中包含libpthread.so
的包裹内容。
注意:此外,-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 :(得分:1)
运行cmake时出现问题。但是,在这种情况下,cmake并不是问题,错误是静默的,并且-lpthreads相关的错误/警告是唯一写入cmake错误日志文件的内容,尽管这不会引起任何问题。 我已经完成了cmakelists.txt的最低版本,并开始逐行对其进行测试,直到找到导致它停止的软件包:最终我发现这是一个版本不匹配...
答案 4 :(得分:0)
这似乎是一个长期存在的CMake错误。发生其他问题,CMake感到困惑,并报告了这个虚假问题,而不是真正的错误。
在您的CMakeLists.txt文件中查找“线程”,并将其暂时删除。
就我而言,这立即指出了缺少的库(或更确切地说是其开发包)。安装后,将其添加到debian/control
的{{1}}部分,重新编译,一切正常。
答案 5 :(得分:0)
请尝试安装一个依赖项glibc-static
在Ubuntu上,您可以尝试apt-get install build-essential
在其他Linux上,您可以安装类似于glibc-static
的软件包。
答案 6 :(得分:0)
在ubuntu 18.04上,我如下解决。
$ sudo apt-get install libboost-all-dev
答案 7 :(得分:0)
我遇到了完全相同的问题,最小的Cmakelists.txt给了我相同的输出。 要解决此问题,只需升级cmake到lastest version (在我的情况下为3.15)
答案 8 :(得分:0)
我也遇到了这个问题。完全相同的情况:在 /lib/x86... 下有 pthread lib,但 find_package() 总是给出“找不到 lpthread 错误”。 经过与朋友的一些检查和咨询,我们发现在我的情况下,我从源代码构建了 cmake,并让 cmake 链接搜索路径错误。因此,我们卸载自建版本并通过添加 apt 源并使用 apt get install 以“正确”的方式重新安装 cmake。这解决了我的问题。希望这可以帮助处于相同情况的人。