web-dev-qa-db-ja.com

UbuntuでCMakeにpthreadを認識させる方法は?

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

次に、この5行のテストアプリ用の簡単なcmakeファイルを作成してみます。

$ 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!
32
Stéphane

ああ、これは苦痛でした!私はおそらくこれで2時間を失いました。解決策は次のとおりです。

CMakeは、短い「C」アプリケーションを使用して、物事をテスト/試行します。 CMをリストせずに、プロジェクトにC++が使用されているとCMakeLists.txtに記載されている場合、これらのショートテストの一部が誤って失敗し、cmakeはそれらが見つからないと判断します。

解決策は、CMakeListsの最初の行をこれから変更することでした:

PROJECT ( Test CXX )

... Cを言語として含めるには:

PROJECT ( Test C CXX )

次にbuildを削除して再作成すると、すべてが機能します。

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