2013-03-04 9 views
31

Se compilo sulla riga di comando con g ++ direttamente, posso vedere tutto quello che serve è lì:Come ottenere CMake per riconoscere pthread su 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... 

Poi cerco di creare un file CMake semplice per questo 5-line Test App:

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

Tuttavia, non riesco a capire il motivo per cui CMake non trova quello che deve utilizzare per 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! 

risposta

47

Oh, questo era stato un dolore! Probabilmente ho perso 2 ore su questo. Ecco la soluzione:

CMake utilizza brevi applicazioni "C" per testare/provare le cose. Se CMakeLists.txt afferma che C++ viene usato per il progetto, senza anche elencare C, allora alcuni di questi test di cortocircuito falliscono in modo errato, e cmake pensa che quelle cose non siano state trovate.

La soluzione era quella di cambiare la prima linea di CMakeLists da questo:

PROJECT (Test CXX) 

... per includere C come linguaggio:

PROJECT (Test C CXX) 

quindi eliminare build, ricrearlo, e tutto quindi funziona:

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

Si deve notare che la dichiarazione 'PROJECT ... 'deve essere dichiarata prima del' Trova ... 'è effettivamente usato. –