web-dev-qa-db-ja.com

コンパイル中に "-pthread"オプションを含めるようにcmakeを強制するにはどうすればよいですか?

find_package(Threads)のようなものがあることは知っていますが、(少なくともそれ自体は)違いを生むようには見えません。今のところSET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-pthread")を使用していますが、それは私にとって正しい解決策のようには見えません。

33
Tomasz Grobelny

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} )
50
ltc

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 に従って、インポートされたターゲットの使用を新しいコードに強くお勧めします

43
Alex Che

以下はどうですか:

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} )
6
user3701085