Как заставить 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!
Ответы
Ответ 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 ..