如何让 CMake 在 Ubuntu 上识别 pthread?

Posted

技术标签:

【中文标题】如何让 CMake 在 Ubuntu 上识别 pthread?【英文标题】:How to get CMake to recognize pthread on Ubuntu? 【发布时间】:2013-03-04 02:45:27 【问题描述】:

如果我直接在命令行上用 g++ 编译,我可以看到我需要的一切都在那里:

$ g++ -pthread test.cpp
$ ldd a.out
    linux-vdso.so.1 =>  (0x00007fffd05b3000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4a1ba8d000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4a1b870000)
    ...more...

然后我尝试为这个 5 行测试应用创建一个简单的 cmake 文件:

$ cat CMakeLists.txt 
PROJECT ( Test CXX )
CMAKE_MINIMUM_REQUIRED ( VERSION 2.8 )
FIND_PACKAGE ( Threads REQUIRED )
ADD_EXECUTABLE ( test test.cpp )
TARGET_LINK_LIBRARIES ( test $CMAKE_THREAD_LIBS_INIT )

但是,我无法弄清楚为什么 CMake 找不到它需要用于 Threads 的内容:

$ cd build/
$ cmake ..
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (MESSAGE):
  Could NOT find Threads (missing: Threads_FOUND)
Call Stack (most recent call first):
  /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:288 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-2.8/Modules/FindThreads.cmake:166 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:4 (FIND_PACKAGE)
-- Configuring incomplete, errors occurred!

【问题讨论】:

【参考方案1】:

哦,这太痛苦了!我可能为此浪费了2个小时。这是解决方案:

CMake 使用简短的“C”应用程序来测试/尝试事物。如果 CMakeLists.txt 声明项目使用了 C++,但没有列出 C,那么其中一些短路测试会错误地失败,然后 cmake 会认为这些东西没有找到。

解决方案是从这里更改 CMakeLists 的第一行:

PROJECT ( Test CXX )

...将 C 作为一种语言包括在内:

PROJECT ( Test C CXX )

然后删除build,重新创建它,然后一切正常:

rm -rf build
mkdir build
cd build
cmake ..

【讨论】:

需要注意的是PROJECT ...声明应该在Find ...被实际使用之前声明。 在 Ubuntu 20.04 上没有帮助我:(

以上是关于如何让 CMake 在 Ubuntu 上识别 pthread?的主要内容,如果未能解决你的问题,请参考以下文章

在 CMake 项目中找不到 spdlog.h

使用 CMake 构建时如何使 QtCreator 识别 OpenGL 函数的自动完成功能?

[ubuntu][原创]如何在没有root权限下更换成自己gcc

为什么MSBuild会将.tlog文件生成到CMakeFiles / CompilerIdC中,如何让它停止?

如何让 CMake 在 Windows 上找到 google protobuf?

Raspberry 上的 Libtorch 无法加载 pt 文件但在 ubuntu 上工作