web-dev-qa-db-fra.com

Comment faire pour que CMake reconnaisse pthread sur Ubuntu?

Si je compile directement sur la ligne de commande avec g ++, je peux voir que tout ce dont j'ai besoin est là:

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

Ensuite, j'essaie de créer un simple fichier cmake pour cette application de test à 5 lignes:

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

Cependant, je ne peux pas comprendre pourquoi CMake ne trouve pas ce dont il a besoin pour 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!
32
Stéphane

Oh, c'était une douleur! J'ai probablement perdu 2 heures à ce sujet. Voici la solution:

CMake utilise de courtes applications "C" pour tester/essayer des choses. Si le CMakeLists.txt indique que C++ est utilisé pour le projet, sans également répertorier C, certains de ces tests courts échouent incorrectement, et cmake pense alors que ces choses ne sont pas trouvées.

La solution était de changer la première ligne de CMakeLists de ceci:

PROJECT ( Test CXX )

... pour inclure C comme langage:

PROJECT ( Test C CXX )

Ensuite, supprimez build, recréez-le, et tout fonctionne alors:

rm -rf build
mkdir build
cd build
cmake ..
53
Stéphane