c++ - Cmake错误未定义对`pthread_create'的引用
问题描述
我对 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
我的问题是为什么执行测试 CMAKE_HAVE_LIBC_PTHREAD - 失败,并且由于它失败了,它是否真的找到了线程,我完全糊涂了。感谢您的回复!
解决方案
CMakeError.txt
在CMake 报告编译器不工作或 CMake 报告不可用功能(通过探针编译/链接检测到)之前,有一点理由进行检查,但您希望该功能可用。
在您的情况下,您已成功配置 CMake(查看 CMake 输出中的最后几行),并且您已成功检测到与线程相关的库(见下文)。没有理由担心,也没有理由调查CMakeError.txt
。
它真的找到线程了吗?
是的,找到了线程。例如,CMake 明确指出
-- Found Threads: TRUE
其他推断方法,已找到线程:
您将
REQUIRED
关键字与find_package(Threads)
. 如果找不到线程,CMake 将报告错误并终止配置。您可以在通话
Threads_FOUND
后检查变量。find_package(Threads)
(使用REQUIRED
关键字此检查是多余的)。您可以在通话
Threads::Threads
后检查目标。find_package(Threads)
(使用REQUIRED
关键字此检查是多余的)。
推荐阅读
- java - 怀疑syncadapter和accountmanager
- firebase - Firestore ClassNotFoundException:com.google.auth.oauth2.GoogleCredentials 和 com/google/api/client/googleapis/util/Utils
- javascript - 在主机上编辑 docker 卷数据而不在容器内更改?
- angular - 在进行 ng build --prod 时从 angular 4 升级到 angular 5 时出错
- android - Webview 内容未显示
- stripe-payments - 条纹:StripeInvalidRequestError 错误:没有这样的令牌:btok_1CQUtNI6UceP4uARenSx4Cjo
- javascript - React Native:如何将 PanResponder 添加到 Touchable 元素?
- swift - 快速在标签中显示数组
- sql - 如何防止 SQL 中的删除查询
- node.js - 如何在 node.js + pac-resolver 中为代理脚本配置 .pac 文件