find_package(Threads)
のようなものがあることは知っていますが、(少なくともそれ自体は)違いを生むようには見えません。今のところSET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-pthread")
を使用していますが、それは私にとって正しい解決策のようには見えません。
find_package( Threads )
はCMakeモジュールを呼び出し、最初にこのプラットフォームに適したスレッドパッケージをファイルシステムで検索してから、CMAKE_THREAD_LIBS_INIT変数(およびその他の変数)を設定します。 CMakeに、実行可能ファイルを見つけたスレッドライブラリに対してリンクするよう指示しません。 target_link_libraries()
コマンドを使用して、「スレッド」ライブラリに対して実行可能ファイルをリンクするようにCMakeに指示します。したがって、たとえば、プログラムがテストと呼ばれるとしましょう。スレッドに対してリンクするには、以下を行う必要があります。
find_package( Threads )
add_executable( test test.cpp )
target_link_libraries( test ${CMAKE_THREAD_LIBS_INIT} )
CMakeの最新バージョン(> = 3.1)のThreadsモジュールは、Threads :: Threadsインポート済みターゲットを生成します。 Threads :: Threadsに対してターゲットをリンクすると、必要なすべてのコンパイルおよびリンクフラグが追加されます。次のように実行できます。
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
set(THREADS_PREFER_PTHREAD_FLAG TRUE)
find_package(Threads REQUIRED)
add_executable(test test.cpp)
target_link_libraries(test Threads::Threads)
CMake docs に従って、インポートされたターゲットの使用を新しいコードに強くお勧めします
以下はどうですか:
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
find_package(Threads REQUIRED)
if(CMAKE_USE_PTHREADS_INIT)
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-pthread")
elseif(...)
...
endif()
add_executable( test test.cpp )
target_link_libraries( test ${CMAKE_THREAD_LIBS_INIT} )