cmake এবং libpthread


188

আমি দৌড়াচ্ছি RHEL 5.1এবং ব্যবহার করছি gcc

সংকলন এবং সংযোগ cmakeযুক্ত -pthreadকরতে আমি কীভাবে বলব ?


1
আপনি কি এর জন্য একটি উত্তর চয়ন করতে পারেন?
জ্যারেড বুরোজ

1
বাবু, আপনি উত্তর হিসাবে ম্যানুয়েল এর পছন্দ করতে হবে।

@ এহসান হাউস এর উত্তর আরও ভাল! :-)
Ela782

উত্তর:


206

@ ম্যানুয়েল সেখানে অংশ ছিল। আপনি এই সংকলক বিকল্পটিও যুক্ত করতে পারেন:

আপনার যদি সিএমকে ৩.১.০+ থাকে তবে এটি আরও সহজ হয়ে যায় :

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

আপনি যদি সিএমকে ২.৮.১২+ ব্যবহার করছেন তবে আপনি এটিকে সহজ করতে পারবেন:

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

আপনি যদি সিএমকে ৩.১++ দিয়ে প্রথম দুটি পদ্ধতির একটি ব্যবহার করতে চান তবে আপনাকেও set(THREADS_PREFER_PTHREAD_FLAG ON)সেখানে প্রয়োজন হবে।


দেখে মনে হচ্ছে যেমন সিএমকে ৩.০.২ থ্র্যাডস_এএভিএইচপিপিটিআরডি_আরজি সেট করবে না যদি পাইথ্রেড লাইব্রেরি পাওয়া যায় ( NOT CMAKE_HAVE_THREADS_LIBRARY), যেমন উবুন্টু 15.04 :(
এমলেট

1
সিএমকে ২.৮.১২+ এর জন্য প্রদত্ত সংস্করণটি কীভাবে কোডে কাজ করে /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

এটি ত্রুটিটি দেয় "টার্গেটের জন্য লিঙ্ক লাইব্রেরি নির্দিষ্ট করতে পারে না" আমার_অ্যাপ "যা এই প্রকল্পের দ্বারা নির্মিত হয়নি।" - প্রতিটি লক্ষ্যের জন্য স্বতন্ত্রভাবে না করে আপনি কীভাবে এটি সর্বজনীনভাবে সক্ষম করবেন?
ক্রিস ডড

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
: @Simon একটু দেরী কিন্তু দয়া করে এই দেখতে stackoverflow.com/questions/15193785/...
congusbongus

কঙ্গক্সু ধন্যবাদ! জানা ভাল!
সাইমন

1
এই সমাধানটি ম্যাক ওএস এক্স, সেন্টোস 6 এবং সোলারিস 10-এ কাজ করে
বার্নার্ডন

1
দ্রষ্টব্য যে এটি অগঠিত সংকলক পতাকা সেট
মল্ট

25

এখানে ডান আনসারটি রয়েছে:

ADD_EXECUTABLE(your_executable ${source_files})

TARGET_LINK_LIBRARIES( your_executable
pthread
)

সমতুল্য

-lpthread

এটি সমতুল্য। "-প্রেড" আরও অনেক অনুদান দেয় - সংকলনে এটি -D_REENTRANT, লিঙ্ক টাইম -পথড্রেডে। কিছু সিস্টেমে এমনকি এর চেয়েও বেশি কিছু হতে পারে।
ডিম্বা

2
SET (CMAKE_CXX_FLAGS_DEBUG "... -প্রথম") SET (CMAKE_CXX_FLAGS_RELEASE "... -পথ")
নাদির SOUALEM

21
আপনি লিনাক্স থেকে ফ্রিবিএসডি বা উইন্ডোতে পরিবর্তন করার সাথে সাথে এই সমাধানের ইটগুলি।
অ্যালেক্স

4
এটি কীভাবে রচনা করা উচিত তা "টার্গেট_লিঙ্ক_লাইব্রিজ (আপনার_অক্ষেত্রযুক্ত pthread)" কাজ করে না।
ওভারভিউ

6
এটি কোনও উপায়ে সঠিক উত্তর নয়। এমনকি যদি আপনি হাউসটির উত্তর পছন্দ না করেন এবং এটি 2009 সালে লেখা হয়েছিল বিবেচনা করে এটি সম্পূর্ণ অ ক্রস প্ল্যাটফর্ম। হাউসটির উত্তরটি ব্যবহার করুন - এবং যদি আপনি এটি পছন্দ না করেন তবে এমন কোনও কিছুর জন্য যান target_link_libraries(target "$<$<CXX_COMPILER_ID:GNU>:-pthread>$<$<CXX_COMPILER_ID:Clang>:-pthreads>")যা অন্তত লক্ষ্য-ভিত্তিক এবং উইন্ডোজ এবং অন্যান্য প্ল্যাটফর্মগুলিতে ব্যর্থ হয় না।
Ela782
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.