লিনাক্সের অধীনে জিসিসিতে std :: থ্রেড ব্যবহার করার জন্য সঠিক লিঙ্ক বিকল্পগুলি কী কী?


88

হাই আমি std::threadজি ++ দিয়ে ব্যবহার করার চেষ্টা করছি । আমার পরীক্ষার কোডটি এখানে

#include <thread>
#include <iostream>

int main(int, char **){
    std::thread tt([](){ std::cout<<"Thread!"<<std::endl; });
    tt.join();
}

এটি সংকলন করে, তবে যখন আমি এটি চালানোর চেষ্টা করি ফলাফল হয়:

terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted 
Aborted

আমার সংকলক সংস্করণ:

$ g++ --version
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

আমার পরীক্ষার কোডটিতে কী ভুল?

আপডেট: আমি আমার কোডটি সংকলন করতে এবং চালাতে নিম্নলিখিত কমান্ড লাইনটি ব্যবহার করি।

$ g++ -std=c++0x test.cpp
$ ./a.out

এবং আমি চেষ্টা করেছিলাম

$ g++ -std=c++0x -lpthread test.cpp
$ ./a.out

এখনও একই.


7
@Earth ইঞ্জিন: এই তাই উত্তর ব্যাখ্যা দিয়েছে কেন সেখানে pthread গ্রন্থাগার ছাড়া কোন লিংক ত্রুটি আছে: stackoverflow.com/a/6266345/12711 সংক্ষিপ্ত উত্তর: glibcঅনেক pthread কাজকর্মের জন্য কুড়ে নিবন্ধসমূহ হয়েছে।
মাইকেল বারার

@ আর্থ ইজাইন আপনি কি দয়া করে একটি উত্তর একটি সমাধান দিতে পারেন? বিশেষত যে -lpthreadঅবশ্যই উত্স ফাইলটি অনুসরণ করবে।
নদী

উত্তর:


102

আমি মনে করি লিনাক্সে pthread প্রয়োগ করার জন্য ব্যবহৃত হয় std::threadসুতরাং আপনাকে -pthreadসংকলক বিকল্পটি নির্দিষ্ট করতে হবে ।

এটি একটি সংযোগ বিকল্প হিসাবে, এই সংকলক বিকল্পটি উত্স ফাইলগুলির পরে হওয়া দরকার :

$ g++ -std=c++0x test.cpp -pthread

আমি জিসিসি ৪.7.১ ব্যবহার করে একটি খুব সাধারণ প্রোগ্রাম সংকলনের চেষ্টা করছি এবং আমার খুব একই "অপারেশনটির অনুমতি নেই" ত্রুটি হচ্ছে। সমস্যাটি হ'ল আমি ইতিমধ্যে-প্রশস্ত পতাকা ব্যবহার করছি। আপনি কি জানেন যে অন্য কোন পতাকা আছে?
ফিলিপ করুন

6
আমি লিঙ্কার বিকল্পগুলি থেকে "-স্ট্যাটিক" পতাকাটি সরানোর সমস্যার সমাধান করেছি, কেন এমন হয় তা জানেন না
ফিলিপ

আমি ভাবছি যে -গর্ভস্থ বিকল্প ছাড়া সংকলন করার সময় সংকলক কেন ত্রুটি দেয় না। কেউ ??
zeus2

4
উবুন্টু 14.04 g ++ - রূপান্তর (g ++ (উবুন্টু / লিনারো 4.8.1-10ubuntu9) 4.8.1) এর অধীনে আমাকে -W1, - না-হিসাবে প্রয়োজন জি ++ --std = সি ++ 11 -ডাব্লু, --no হিসাবে প্রয়োজন -pthread main.cc
Begui

4
-Wl,--whole-archive -lpthread -Wl,--no-whole-archiveসমস্যা সমাধান করে, না -pthread। এটি লিঙ্ক ইস্যু লিঙ্কটি অনুসারে man gcc -pthreadকেবলমাত্র জি ++ অপশন যা মাল্টিথ্রেডিং সমর্থন যোগ করে যা প্রিপ্রসেসর এবং লিঙ্কার উভয়ের জন্য পতাকা সেট করে
ডেনিস জাইকিন

6

ব্যবহারের পাশাপাশি -std=c++0xএবং -pthreadআপনাকে অবশ্যই ব্যবহার করা উচিত নয়-static


5

-std=c++11 -static -pthread -Wl,--whole-archive -lpthread -Wl,--no-whole-archiveএকসাথে কাজ -static!!!

এখানে দেখুন: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52590#c4


এটি সঙ্গে সুপার বিশাল --whole-archive। আমি দেখতে পেয়েছি যে স্থির সংযোগের জন্য অন্য উত্তরটি আমার জন্য ওপেনডব্লিউআরটি
এমলেট

2

থ্রেড ব্যবহার করে এমন একটি সি ++ 11 প্রোগ্রাম সংকলনের জন্য এখানে একটি সাধারণ সিএমকে ফাইল রয়েছে:

সিএমকেলিস্ট.টেক্সট:

cmake_minimum_required(VERSION 2.8)
list(APPEND CMAKE_CXX_FLAGS "-pthread -std=c++11 ${CMAKE_CXX_FLAGS}")
add_executable(main main.cpp)

এটি নির্মাণের একটি উপায়:

mkdir -p build
cd build
cmake .. && make

4
আপনার সমাধানটি আমার জন্য এইচএমজেডের উত্তরের তুলনায় কোনও উন্নতি নয় এবং অযৌক্তিক স্টাফ যুক্ত করেছে (প্রোফাইলিং, পরীক্ষা-কভারেজ)
ম্যাক্স বেকির্চ

1

একক আদেশে এইভাবে সংকলনের চেষ্টা করুন:

g++ your_prog.cpp -o your_output_binary -lpthread -std=gnu++11

আপনি gnu ++ 11 এর পরিবর্তে C ++ 11ও চেষ্টা করতে পারেন। আশা করি এটি কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.