2013-03-04 125 views
31

如果我編譯與克命令行++直接,我所看到的一切我需要的是有:如何讓CMake識別Ubuntu上的pthread?

$ 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文件中查找該5線的測試程序:

$ 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! 

回答

47

哦,這是一個痛苦!我可能會在這個2小時內失去。這裏是解決方案:

CMake使用簡短'C'應用程序來測試/嘗試的東西。如果CMakeLists.txt聲明C++用於該項目,而沒有列出C,那麼其中一些shorts測試錯誤地失敗,然後cmake認爲找不到這些東西。

的解決方案是CMakeLists的第一行從:

PROJECT (Test CXX) 

...包括C作爲一種語言:

PROJECT (Test C CXX) 

然後刪除build,重新創建它,一切然後運行:

rm -rf build 
mkdir build 
cd build 
cmake .. 
+3

需要注意的是'PROJECT ...'聲明應該在'Find ......實際上是用的。 – 2013-11-27 01:22:27