लिंक का उपयोग करने के लिए सही लिंक विकल्प क्या हैं :: लिनक्स में GCC में धागा?


87

नमस्ते मैं std::threadG ++ के साथ उपयोग करने का प्रयास कर रहा हूं । यहाँ मेरा परीक्षण कोड है

#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 Engine: यह SO उत्तर बताता है कि क्यों पार्थरेड लाइब्रेरी के बिना कोई लिंक त्रुटियां नहीं हैं: stackoverflow.com/a/6266345/12711 लघु उत्तर: glibcमें कई pthread फ़ंक्शंस के लिए कुछ भी नहीं है।
माइकल बूर

@EarthEngine क्या आप जवाब में समाधान डाल सकते हैं? विशेष रूप से स्रोत फ़ाइल का पालन-lpthread करना चाहिए ।
नदी

जवाबों:


101

मुझे लगता है कि Linux pthread का उपयोग कार्यान्वित करने के लिए किया जाता है std::threadइसलिए आपको -pthreadकंपाइलर विकल्प को निर्दिष्ट करने की आवश्यकता होती है ।

जैसा कि यह एक लिंकिंग विकल्प है, इस संकलक विकल्प को स्रोत फ़ाइलों के बाद होने की आवश्यकता है :

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

मैं gcc 4.7.1 का उपयोग करके एक बहुत ही सरल प्रोग्राम को संकलित करने की कोशिश कर रहा हूं और मैं बहुत ही "ऑपरेशन की अनुमति नहीं" त्रुटि कर रहा हूं। समस्या यह है कि मैं पहले से ही-ध्वज का उपयोग कर रहा हूं। क्या कोई और झंडा है जिसके बारे में आप जानते हैं?
फ़िलिप

5
मैंने लिंकर विकल्पों से "-स्टिक" झंडे को हटाने की समस्या को हल किया, पता नहीं ऐसा क्यों होता है
फ़िलिप

मैं सोच रहा हूँ कि कंपाइलर -lpreadread विकल्प के बिना कंपाइल करने पर कोई त्रुटि क्यों नहीं देता। कोई??
zeus2

1
Ubuntu 14.04 g ++ --version (g ++ (Ubuntu / Linaro 4.8.1-10ubuntu9) 4.8.1) के तहत मुझे -W1, -no-as-need g ++ --std = c ++ 11 -Wl, जोड़ना होगा - कोई जरूरत के रूप में -pthread main.cc
बेगुई

1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archiveसमस्या को हल करता है, नहीं -pthread। यह लिंक इश्यू लिंकman gcc -pthread है। सिर्फ g ++ विकल्प के अनुसार मल्टीथ्रेडिंग सपोर्ट जोड़ता है जो प्रीप्रोसेसर और लिंकर दोनों के लिए झंडे सेट करता है
डेनिस ज़िकिन


4

-std=c++11 -static -pthread -Wl,--whole-archive -lpthread -Wl,--no-whole-archiveसाथ काम करता है -static!!!

यहां देखें: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52590##4


इसके साथ सुपर भारी हो जाता है --whole-archive। मैंने पाया कि OpenWRT पर मेरे लिए स्थैतिक लिंकिंग के लिए एक और जवाब
23

2

यहाँ थ्रेड का उपयोग करने वाले C ++ 11 प्रोग्राम को संकलित करने के लिए एक सरल सीएमके फ़ाइल है:

CMakeLists.txt:

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

2
मेरे लिए hmjd के उत्तर पर आपके समाधान में कोई सुधार नहीं हुआ है और इसमें अनुपयोगी सामान (प्रोफाइलिंग, परीक्षण-कवरेज)
जोड़ा गया है

1

एकल कमांड में इस तरह से संकलन करने का प्रयास करें:

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

आप ग्नू ++ 11 के बजाय C ++ 11 भी आज़मा सकते हैं। आशा है कि यह काम करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.