2013-03-04 12 views
31

Jeśli mogę skompilować na linii poleceń z g ++ bezpośrednio, widzę wszystko, czego potrzebujesz tam jest:Jak uzyskać CMake do rozpoznawania pthread na 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... 

Wtedy staram się stworzyć prosty plik cmake do tego 5-linii testowej aplikacji:

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

jednak nie mogę zrozumieć dlaczego CUpewnij nie znajdzie to, czego potrzebuje, aby użyć do 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! 

Odpowiedz

47

Och, było to było uciążliwe! Prawdopodobnie straciłem 2 godziny na ten temat. Oto rozwiązanie:

CMake używa krótkich aplikacji "C" do testowania/wypróbowywania różnych rzeczy. Jeśli CMakeLists.txt stwierdza, że ​​C++ jest używane do projektu, bez wpisywania C, to niektóre z tych testów skrótu błędnie się nie udają, a cmake myśli, że te rzeczy nie zostały znalezione.

Rozwiązaniem było zmienić pierwszą linię CMakeLists z tego:

PROJECT (Test CXX) 

... obejmować C jako język:

PROJECT (Test C CXX) 

następnie usunąć build, odtworzyć go i wszystko następnie działa:

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

Należy zauważyć, że deklaracja 'PROJEKT ...' powinna znajdować się przed 'Znajdź ... 'jest faktycznie używany. –

Powiązane problemy