Подтвердить что ты не робот

Как заставить CMake распознавать pthread на Ubuntu?

Если я скомпилирую непосредственно в командной строке с g++, я вижу все, что мне нужно:

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

Ответ 1

О, это была боль! Вероятно, я потерял 2 часа. Вот решение:

CMake использует короткие "C" приложения для тестирования/тестирования. Если в CMakeLists.txt указано, что С++ используется для проекта, не включая также список C, то некоторые из этих тестов shorts ошибочно терпят неудачу, а cmake затем думает, что эти вещи не найдены.

Решение заключалось в том, чтобы изменить первую строку CMakeLists:

PROJECT ( Test CXX )

... включить C в качестве языка:

PROJECT ( Test C CXX )

Затем удалите build, заново создайте его, и все будет работать:

rm -rf build
mkdir build
cd build
cmake ..