cmake और libpthread


188

मैं दौड़ रहा हूं RHEL 5.1और उपयोग कर रहा हूं gcc

मैं संकलन और लिंकिंग cmakeको कैसे जोड़ूं -pthread?


1
क्या आप इसके लिए कोई उत्तर चुन सकते हैं?
जेरेड बुरो

1
यार, तुम जवाब के रूप में @ मैनुअल का चयन होगा।

@ एहसान के इनहाउस का जवाब बेहतर है! :-)
एला --२ --२

जवाबों:


206

@ मैनुअल वहां का हिस्सा था। आप कंपाइलर विकल्प को इस तरह जोड़ सकते हैं:

यदि आपके पास 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()

पुराने सीएमके संस्करणों की आवश्यकता हो सकती है:

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()

यदि आप सीएमके 3.1+ के साथ पहले दो तरीकों में से एक का उपयोग करना चाहते हैं, तो आपको set(THREADS_PREFER_PTHREAD_FLAG ON)वहां भी आवश्यकता होगी ।


ऐसा लगता है जैसे कि CMake 3.0.2 THREADS_HAVE_PTHREAD_ARG सेट नहीं करेगा यदि pthread पुस्तकालय पाया गया ( NOT CMAKE_HAVE_THREADS_LIBRARY), उदाहरण के लिए Ubuntu 15.04 :(
mlt

1
सीएमके 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) और काम होना चाहिए (खोज मॉड्यूल कहा जाता है 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 केवल प्रोजेक्ट में उपयोग करने पर यह काम नहीं करता है। किसी को भी एक अच्छा समाधान पता है?
साइमन

1
@ थोड़ा सा देर से लेकिन कृपया इसे देखें: stackoverflow.com/questions/15193785/…
congusbongus

@CongXu धन्यवाद! जानकार अच्छा लगा!
साइमन

1
यह समाधान मैक ओएस एक्स, सेंटोस 6 और सोलारिस 10.
बर्नार्डन

1
ध्यान दें कि यह- संकलक ध्वज को सेट
ml

25

यहाँ सही awser है:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)

के बराबर

-lpthread

यह बराबर है। "-pthread" लिंक समय -Lpthread पर संकलन -D_REENTRANT संकलन में बहुत अधिक दान करता है। कुछ सिस्टम पर भी इससे अधिक हो सकता है।
दिम्बा

2
सेट (CMAKE_CXX_FLAGS_DEBUG "... -lpthread") SET (CMAKE_CXX_FLAGS_RELEASE "... -Lpread")
नादिर SOALALEM

21
जैसे ही आप linux से freebsd या windows में बदलते हैं, यह सॉल्यूशन ईंटों में बदल जाता है।
एलेक्स

4
काम नहीं करता है, "target_link_lbooks (your_executable pthread)" यह कैसे लिखा जाना चाहिए।
Overv

6
यह किसी भी तरह से सही जवाब नहीं है। भले ही आपकोहाउस का उत्तर पसंद नहीं है, और यह देखते हुए कि यह 2009 में लिखा गया था, यह पूरी तरह से गैर-क्रॉस प्लेटफॉर्म है। इनहाउस के उत्तर का उपयोग करें - और यदि आपको यह पसंद नहीं है, तो कुछ ऐसी चीज़ के लिए जाएं, target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")जो कम से कम लक्ष्य-आधारित हो और विंडोज और अन्य प्लेटफार्मों पर विफल न हो।
इला 782
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.