2013-03-04 33 views
31

Nếu tôi biên dịch trên dòng lệnh với g ++ trực tiếp, tôi có thể nhìn thấy tất cả mọi thứ tôi cần là ở đó:Làm thế nào để CMake nhận ra pthread trên Ubuntu?

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

Sau đó, tôi cố gắng tạo ra một tập tin cmake đơn giản cho 5 dòng ứng dụng này kiểm tra:

$ 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}) 

Tuy nhiên, tôi không thể tìm ra lý do tại sao CMake không tìm thấy những gì nó cần để sử dụng cho 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! 

Trả lời

47

Oh, đây là là một nỗi đau! Tôi có thể mất 2 giờ về điều này. Đây là giải pháp:

CMake sử dụng các ứng dụng 'C' ngắn để kiểm tra/thử mọi thứ. Nếu CMakeLists.txt nói rằng C++ được sử dụng cho dự án, mà không cần liệt kê C, thì một số thử nghiệm quần short đó không đúng, và sau đó cmake nghĩ rằng những thứ đó không được tìm thấy.

Giải pháp là thay đổi dòng đầu tiên của CMakeLists từ này:

PROJECT (Test CXX) 

... để bao gồm C như một ngôn ngữ:

PROJECT (Test C CXX) 

Sau đó xóa build, tái tạo nó, và tất cả mọi thứ sau đó hoạt động:

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

Người ta phải lưu ý rằng khai báo 'DỰ ÁN ...' phải được khai báo trước khi 'Tìm ... 'thực sự được sử dụng. –