cmakeおよびlibpthread


188

私は走っRHEL 5.1て使っていますgcc

コンパイルとリンクcmakeに追加-pthreadするように指示するにはどうすればよいですか?


1
これに対する答えを選択できますか?
Jared Burrows

1
おい、あなたは答えとして@ Manuel'sを選ばなければならない。

@Ehsan thehouseの答えははるかに優れています!:-)
Ela782 16

回答:


208

@マヌエルは途中でした。次のように、コンパイラオプションも追加できます。

CMake 3.1.0+を使用している場合、これはさらに簡単になります。

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(my_app PRIVATE Threads::Threads)

CMake 2.8.12+を使用している場合は、これを簡略化して次のようにすることができます。

find_package(Threads REQUIRED)
if(THREADS_HAVE_PTHREAD_ARG)
  target_compile_options(my_app PUBLIC "-pthread")
endif()
if(CMAKE_THREAD_LIBS_INIT)
  target_link_libraries(my_app "${CMAKE_THREAD_LIBS_INIT}")
endif()

古いバージョンのCMakeでは、次のものが必要になる場合があります。

find_package(Threads REQUIRED)
if(THREADS_HAVE_PTHREAD_ARG)
  set_property(TARGET my_app PROPERTY COMPILE_OPTIONS "-pthread")
  set_property(TARGET my_app PROPERTY INTERFACE_COMPILE_OPTIONS "-pthread")
endif()
if(CMAKE_THREAD_LIBS_INIT)
  target_link_libraries(my_app "${CMAKE_THREAD_LIBS_INIT}")
endif()

CMake 3.1+で最初の2つの方法のいずれかを使用する場合は、set(THREADS_PREFER_PTHREAD_FLAG ON)そこにも必要になります。


たとえば、pthreadライブラリが見つかった場合、CMake 3.0.2はTHREADS_HAVE_PTHREAD_ARGを設定しないようです(NOT CMAKE_HAVE_THREADS_LIBRARY)。例:Ubuntu 15.04 :(
mlt

1
CMake 2.8.12+に指定されたバージョンは、コードがどのように機能するかが原因で、意図したとおりに機能しません/usr/share/cmake-2.8/Modules/FindThreads.cmake(例:apt-browse.org/browse/ubuntu/trusty/main/all/cmake-data/…を参照)。基本的に、THREADS_HAVE_PTHREAD_ARG(すなわち、フラグの他の変形例が見つからなかった場合にのみセットされ-lpthread-lpthreadまたは-lthread
j1eloを

これにより、「このプロジェクトでビルドされていないターゲット "my_app"のリンクライブラリを指定できません。」というエラーが発生します。-各ターゲットに対して個別に行う必要なしに、どのようにしてそれを普遍的に有効にしますか?
クリス・ドッド

まだ最初の方法は2020 / cmake 3.17で最も簡単な方法ですか?
ジェイ

THREADS_PREFER_PTHREAD_FLAGフラグを設定せず、検索してリンクした場合はどうなりますか?
ジェイ

199

次のコードはクリーンで(を使用してfind_package)、正常に機能します(findモジュールはと呼ばれますFindThreads)。

cmake_minimum_required (VERSION 2.6) 
find_package (Threads)
add_executable (myapp main.cpp ...)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})

2
これは、CXXのみのプロジェクトで使用する場合は機能しません。誰かが良い回避策を知っていますか?
Simon、

1
少し遅れて@Simonが、この参照してください。stackoverflow.com/questions/15193785/...
congusbongus

@CongXuありがとう!知っておきたい!
Simon

1
このソリューションは、Mac OS X、CentOSに6およびSolaris 10 accros作品
bernardn


26

これが正しいアンサーです:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)

に相当

-lpthread

これは同等です。「-pthread」ははるかに多くを寄付します-コンパイル時は-D_REENTRANTで、リンク時は-lpthreadです。一部のシステムでは、これ以上になることもあります。
dimba 2009年

2
SET(CMAKE_CXX_FLAGS_DEBUG "... -lpthread")SET(CMAKE_CXX_FLAGS_RELEASE "... -lpthread")
Nadir SOUALEM 2009年

21
このソリューションは、LinuxからfreebsdまたはWindowsに変更するとすぐに機能します。
アレックス

4
動作しません。「target_link_libraries(your_executable pthread)」がその記述方法です。
2015

6
これは決して正しい答えではありません。家の答えが気に入らなくても、これが2009年に書かれたと考えると、完全にクロスプラットフォームではありません。家の答えを使用してください-そしてそれが気に入らない場合target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")は、少なくともターゲットベースで、Windowsや他のプラットフォームで失敗しないようなものを選びます。
Ela782 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.