由于警告,CMake 未能检测到 pthread

Posted

技术标签:

【中文标题】由于警告,CMake 未能检测到 pthread【英文标题】:CMake failing to detect pthreads due to warnings 【发布时间】:2014-09-08 22:22:06 【问题描述】:

使用 CMake 制作项目时出现错误:

-- Could NOT find Threads (missing:  Threads_FOUND)

错误日志显示 CMake 被一些真正平庸的东西绊倒了:

/usr/bin/cc   -std=c11 -D_GNU_SOURCE   -Wall -Wextra -Wpointer-arith -Wundef -Wvla -Wwrite-strings -Werror -Wno-error=extra -Wno-error=deprecated-declarations -Wno-error=sign-compare -Wno-error=strict-aliasing -Wno-error=type-limits -Wno-unused-parameter -Wno-error=unused-variable -Wno-error=undef -Wno-error=uninitialized -Wlogical-op -Wno-error=maybe-uninitialized -Waggregate-return -Wnested-externs -Wold-style-definition -Wstrict-prototypes -march=native    -o CMakeFiles/cmTryCompileExec2533162744.dir/CheckIncludeFiles.c.o   -c /mnt/shared/fooproj/build/release/CMakeFiles/CMakeTmp/CheckIncludeFiles.c
/mnt/shared/fooproj/build/release/CMakeFiles/CMakeTmp/CheckIncludeFiles.c:5:5: 
     error: function declaration isn’t a prototype [-Werror=strict-prototypes]
 int main()return 0;
 ^
/mnt/shared/fooproj/build/release/CMakeFiles/CMakeTmp/CheckIncludeFiles.c: 
     In function ‘main’:
/mnt/shared/fooproj/build/release/CMakeFiles/CMakeTmp/CheckIncludeFiles.c:5:5: 
     error: old-style function definition [-Werror=old-style-definition]
cc1: all warnings being treated as errors
[...]
Source:
/* */
#include <pthread.h>


int main()return 0;

这真的不应该是 CMake 认为线程不存在的理由。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

我相信这是我刚刚报告的CMake bug 15058。

CMake 用于检查包含文件的测试使用旧式 C 函数定义。如果-Wold-style-definition -Werror 有效,gcc 将对此表示反对。

我在上面链接的错误报告中包含了一个补丁,但为了快速修复,请在您的 CMake 安装中找到文件 Modules/CheckIncludeFiles.cmake(可能在 /usr/share/cmake 或类似文件中),找到该行

  "$CMAKE_CONFIGURABLE_FILE_CONTENT\n\nint main()return 0;\n")

并将int main() 更改为int main(void)

【讨论】:

这确实可以找到包含文件,但似乎这还不够。一旦我做出改变并重新创建它,我就会得到this output。但是,如果我在CMakeLists.txt 中有this,那么it works。看起来它本身没有添加-pthread?然而我认为这就是它应该做的? @Claudiu:嗯。您是否再次检查了错误日志?也许还有其他问题。 是的,另一个警告被视为错误失败。我认为“检查编译器是否接受 -pthread”应该是唯一有效的方法,但它失败了,@ 987654325@。我通过将违规行更改为 printf("%p CC: %d\n", args, cc); 来修复它 我在全新安装 Ubuntu 16.04 和 cmake 3.5 时收到此错误。 CheckIncludeFiles.cmake 已经包含 main(void)。在我的 14.04 上使用具有 main() 的 cmake 2.8 构建相同的项目不会给出任何错误 但是,我的项目中也有 find_library(PTHREAD_LIBRARY) 并且发现 lib 没有问题。我在第 223 行的 FindThreads.cmake 中注释掉了 FIND_PACKAGE_HANDLE_STANDARD_ARGS 以解决这个问题。【参考方案2】:

问题似乎仍然存在。 我尝试编译lates nominatim。好像我遇到了同样的错误。

Determining if the pthread_create exist failed with the following output:
Change Dir: /home/mikelaptop/Desktop/nominatim/290102/Nominatim/build/CMakeFiles/CMakeTmp

Run Build Command:"/usr/bin/make" "cmTC_b87d8/fast"
/usr/bin/make -f CMakeFiles/cmTC_b87d8.dir/build.make CMakeFiles/cmTC_b87d8.dir/build
make[1]: Entering directory '/home/mikelaptop/Desktop/nominatim/290102/Nominatim/build/CMakeFiles/CMakeTmp'
Building C object CMakeFiles/cmTC_b87d8.dir/CheckSymbolExists.c.o
/usr/bin/cc    -o CMakeFiles/cmTC_b87d8.dir/CheckSymbolExists.c.o   -c /home/mikelaptop/Desktop/nominatim/290102/Nominatim/build/CMakeFiles/CMakeTmp/CheckSymbolExists.c
Linking C executable cmTC_b87d8
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b87d8.dir/link.txt --verbose=1
/usr/bin/cc      -rdynamic CMakeFiles/cmTC_b87d8.dir/CheckSymbolExists.c.o  -o cmTC_b87d8 
CMakeFiles/cmTC_b87d8.dir/CheckSymbolExists.c.o: In function `main':
CheckSymbolExists.c:(.text+0x1b): undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status
CMakeFiles/cmTC_b87d8.dir/build.make:97: recipe for target 'cmTC_b87d8' failed
make[1]: *** [cmTC_b87d8] Error 1
make[1]: Leaving directory '/home/mikelaptop/Desktop/nominatim/290102/Nominatim/build/CMakeFiles/CMakeTmp'
Makefile:126: recipe for target 'cmTC_b87d8/fast' failed
make: *** [cmTC_b87d8/fast] Error 2

File /home/mikelaptop/Desktop/nominatim/290102/Nominatim/build/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
/* */
#include <pthread.h>

int main(int argc, char** argv)

  (void)argv;
#ifndef pthread_create
  return ((int*)(&pthread_create))[argc];
#else
  (void)argc;
  return 0;
#endif


Determining if the function pthread_create exists in the pthreads failed with the following output:
Change Dir: /home/mikelaptop/Desktop/nominatim/290102/Nominatim/build/CMakeFiles/CMakeTmp

Run Build Command:"/usr/bin/make" "cmTC_eb9e3/fast"
/usr/bin/make -f CMakeFiles/cmTC_eb9e3.dir/build.make CMakeFiles/cmTC_eb9e3.dir/build
make[1]: Entering directory '/home/mikelaptop/Desktop/nominatim/290102/Nominatim/build/CMakeFiles/CMakeTmp'
Building C object CMakeFiles/cmTC_eb9e3.dir/CheckFunctionExists.c.o
/usr/bin/cc   -DCHECK_FUNCTION_EXISTS=pthread_create   -o CMakeFiles/cmTC_eb9e3.dir/CheckFunctionExists.c.o   -c /usr/share/cmake-3.9/Modules/CheckFunctionExists.c
Linking C executable cmTC_eb9e3
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_eb9e3.dir/link.txt --verbose=1
/usr/bin/cc  -DCHECK_FUNCTION_EXISTS=pthread_create    -rdynamic CMakeFiles/cmTC_eb9e3.dir/CheckFunctionExists.c.o  -o cmTC_eb9e3 -lpthreads 
/usr/bin/ld: cannot find -lpthreads
collect2: error: ld returned 1 exit status
CMakeFiles/cmTC_eb9e3.dir/build.make:97: recipe for target 'cmTC_eb9e3' failed
make[1]: *** [cmTC_eb9e3] Error 1
make[1]: Leaving directory '/home/mikelaptop/Desktop/nominatim/290102/Nominatim/build/CMakeFiles/CMakeTmp'
Makefile:126: recipe for target 'cmTC_eb9e3/fast' failed
make: *** [cmTC_eb9e3/fast] Error 2

编辑:cmake -lpthread .. 似乎解决了这个问题

【讨论】:

在 Ubuntu 18.04.5 LTS(2021 年 2 月)上也遇到了这个错误(我相信);所以,仍然没有修复。

以上是关于由于警告,CMake 未能检测到 pthread的主要内容,如果未能解决你的问题,请参考以下文章

检测到电池警告显示 iPhone

Cppcheck Cmake 集成:基于警告中止构建

Elasticsearch未分配分片异常处理

虽然安装了CMake并将其添加到Path,但CLion无法检测到CMake

部署到 heroku - 未能检测到 buildpack nodejs (jasonswett)

CMake 检测到错误版本的 OpenCL