如何让CMake在Ubuntu上识别pthread?

38
如果我直接使用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...

然后我尝试为这个五行测试应用程序创建一个简单的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个回答

63

哦,这真是太痛苦了!我可能在这上面浪费了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 ..

3
需要注意的是,在实际使用 Find ... 之前,应先声明 PROJECT ...。请确保在正确顺序下进行操作。 - Artem Oboturov
在Ubuntu 20.04上没有帮助我 :( - Bouncner
很遗憾,这并没有帮到我,就像我找到的其他解决方案一样 :( - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接