gpt4 book ai didi

c++ - Cmake 报错 undefined reference to `pthread_create'

转载 作者:行者123 更新时间:2023-12-04 14:11:20 24 4
gpt4 key购买 nike

我对 cmake FindThreads 进行了测试。这是我的源代码 test.cpp 和 CMakeLists.txt:

#include <pthread.h>                                                                                                                                                                                                                          
void* test_func(void* data)
{
return data;
}

int main(void)
{
pthread_t thread;
pthread_create(&thread, NULL, test_func, NULL);
pthread_detach(thread);
pthread_cancel(thread);
pthread_join(thread, NULL);
pthread_atfork(NULL, NULL, NULL);
pthread_exit(NULL);
return 0;
}
cmake_minimum_required(VERSION 3.5)                                                                                                                                                                                                           

project(test C CXX)

set(CMAKE_THREAD_PREFER_PTHREAD ON)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
add_executable(test test.cpp)
if(TARGET Threads::Threads)
target_link_libraries(test PRIVATE Threads::Threads)
endif()

当我运行时:

cmake .

我得到输出:

-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Check if compiler accepts -pthread
-- Check if compiler accepts -pthread - yes
-- Found Threads: TRUE

然后我检查 CMakeError.txt,发现:

gmake[1]: Entering directory '/home/hye/tmp/cmake-error/CMakeFiles/CMakeTmp'                                                                                                                                                                  
Building C object CMakeFiles/cmTC_55ab6.dir/src.c.o
/usr/bin/clang -DCMAKE_HAVE_LIBC_PTHREAD -o CMakeFiles/cmTC_55ab6.dir/src.c.o -c /home/hye/tmp/cmake-error/CMakeFiles/CMakeTmp/src.c
Linking C executable cmTC_55ab6
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_55ab6.dir/link.txt --verbose=1
/usr/bin/clang -DCMAKE_HAVE_LIBC_PTHREAD CMakeFiles/cmTC_55ab6.dir/src.c.o -o cmTC_55ab6
/usr/bin/ld: CMakeFiles/cmTC_55ab6.dir/src.c.o: in function `main':
src.c:(.text+0x35): undefined reference to `pthread_create'
/usr/bin/ld: src.c:(.text+0x41): undefined reference to `pthread_detach'
/usr/bin/ld: src.c:(.text+0x4d): undefined reference to `pthread_cancel'
/usr/bin/ld: src.c:(.text+0x5f): undefined reference to `pthread_join'
clang-9: error: linker command failed with exit code 1 (use -v to see invocation)
gmake[1]: *** [CMakeFiles/cmTC_55ab6.dir/build.make:107: cmTC_55ab6] Error 1
gmake[1]: Leaving directory '/home/hye/tmp/cmake-error/CMakeFiles/CMakeTmp'
gmake: *** [Makefile:141: cmTC_55ab6/fast] Error 2

我的问题是为什么执行 Test CMAKE_HAVE_LIBC_PTHREAD - Failed,既然失败了,就做了真的找到Threads了,我一头雾水。感谢您的回复!

最佳答案

有一点理由检查 CMakeError.txt 直到 CMake 报告编译器不工作或 CMake 报告不可用的功能,这是由探针编译/链接检测到的,但您期望 该功能可用。

在您的情况下,您已成功配置 CMake(查看 CMake 输出中的最后几行),并且已成功检测到与线程相关的库(见下文)。没有理由担心,也没有理由查看 CMakeError.txt

did it really find Threads?

是的,已找到 主题。例如,CMake 明确指出

-- Found Threads: TRUE  

其他推断线程已找到的方法:

  1. 您将 REQUIRED 关键字与 find_package(Threads) 一起使用。如果找不到线程,CMake 将报告错误并终止配置。

  2. 您可以在 find_package(Threads) 调用之后检查 Threads_FOUND 变量。 (使用 REQUIRED 关键字此检查是多余的)。

  3. 您可以在 find_package(Threads) 调用之后检查 Threads::Threads 目标。 (使用 REQUIRED 关键字此检查是多余的)。

关于c++ - Cmake 报错 undefined reference to `pthread_create',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63985373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com