Sap*_*ens 24 c++ linux pthreads cmake
我有一个在给定机器上顺利运行的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")
Run Code Online (Sandbox Code Playgroud)
我做了一些研究,已经尝试过以下方法:
-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
Run Code Online (Sandbox Code Playgroud)
还发现了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
Run Code Online (Sandbox Code Playgroud)
我还验证了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()
Run Code Online (Sandbox Code Playgroud)
编辑3
使用最小的Cmakelists.txt如下:
cmake_minimum_required (VERSION 2.4)
find_package(Threads)
Run Code Online (Sandbox Code Playgroud)
其中产生了以下输出:
-- 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
Run Code Online (Sandbox Code Playgroud)
Sap*_*ens 20
运行cmake时发生了问题。虽然,在这种情况下,cmake 不是问题,错误是无声的,与 -lpthreads 相关的错误/警告是唯一写入 cmake 错误日志文件的内容,尽管这并没有引起任何问题。我已经完成了 cmakelists.txt 的最小版本并开始逐行测试它,直到我发现哪个包导致它停止:最后我发现它是版本不匹配......
通常,您会查找最后一条错误消息。然而,这种(通常有用的)策略在这种情况下会误入歧途。
您正在查看的是CMakeCache.txt、CMakeOutput.log或CMakeError.log。怎么会?当配置阶段的某些宏或测试失败时,CMake 会“帮助”将这些文件转储到输出。不幸的是,这些文件可能有数千行长,并且通常包含许多 "*** Error: xyz"条目,用于各种配置检查。 " -lpthreads"的一个偶然碰巧是日志中的最后一个......
解决方案:从顶部查看日志,确定配置检查的部分,找到点之前的最后一次配置检查,CMake 识别失败并转储其日志。您也可以尝试搜索文本“ Configuring incomplete, errors occurred!”
通常,您会在那里找到非常精确的实际错误消息,或者至少您会找到最后调用的宏或函数的名称/路径,这使您可以查明实际出了什么问题。
小智 5
在 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
Run Code Online (Sandbox Code Playgroud)
之后不再出现错误“/usr/bin/ld: 找不到 -lpthreads”
| 归档时间: |
|
| 查看次数: |
45866 次 |
| 最近记录: |