जी ++ के साथ मल्टीथ्रेड कोड का संकलन


89

मेरे पास अब तक का सबसे आसान कोड है:

#include <iostream>
#include <thread>

void worker()
{
    std::cout << "another thread";
}

int main()
{
    std::thread t(worker);
    std::cout << "main thread" << std::endl;
    t.join();
    return 0;
}

हालाँकि मैं अभी भी इसे g++चलाने के लिए संकलित नहीं कर सकता ।

अधिक जानकारी:

$ g++ --version
g++ (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.1
Copyright (C) 2013 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++ main.cpp -o main.out -pthread -std=c++11

चल रहा है:

$ ./main.out 
terminate called after throwing an instance of 'std::system_error'
  what():  Enable multithreading to use std::thread: Operation not permitted
Aborted (core dumped)

और अब मैं फंस गया हूं। इंटरनेट पर हर संबंधित थ्रेड में इसे जोड़ने की सिफारिश की जाती है -pthreadजबकि मेरे पास यह पहले से है।

मैं क्या गलत कर रहा हूं?

पुनश्च: यह एक नया ubuntu 13.10 स्थापना है। केवल g++पैकेज स्थापित किया गया था और मामूली चीजें जैसे chromiumआदि

पी पी एस:

$ ldd ./a.out 
linux-vdso.so.1 => (0x00007fff29fc1000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb85397d000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb853767000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb85339e000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb85309a000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fb853c96000)

PPPS: clang++(v3.2) के साथ यह संकलित होता है और ठीक चलता है

PPPPS: दोस्तों, यह डुप्लिकेट का उपयोग करने के लिए सही लिंक विकल्प क्या है :: linux के तहत GCC में धागा नहीं है?

PPPPPS:

$ dpkg --get-selections | grep 'libc.*dev'
libc-dev-bin                    install
libc6-dev:amd64                 install
libclang-common-dev             install
linux-libc-dev:amd64                install

यह एक libpthread-2.17.soही निर्देशिका में एक सिमलिंक है ।
झटके

हां, यह एक सही लिंक है। यहाँ मेरा dir lrwxrwxrwx है। 1 रूट रूट 18 सितंबर 12 20:52 libpthread.so.0 -> libpthread-2.16.so
जेसन हनोक

@ जेसन हनोक: यह मेरे लिए काम करेगा - मैं सहमत हूं, अगर मैंने छोटी गाड़ी के
जीसी

हाँ, आपके सभी पुस्तकालय मेरे मुकाबले थोड़े नए हैं: gcc संस्करण 4.7.2 20121109 (Red Hat 4.7.2-8) (GCC)
जेसन हनोकस

@ जेसन हनोक: हेहे। अपने आप के लिए मैं पहले से ही संतुष्ट हूँ "यह एक बग" जवाब है, और शायद कल इसे एक पुराने ubuntu पर चलाने की कोशिश करेंगे, बस पूरी तरह से सुनिश्चित करने के लिए
zerkms

जवाबों:


75

उत्तर SO SO ++ चैट के एक प्रकार के सदस्य द्वारा प्रदान किया गया था ।

ऐसा लगता है कि यह व्यवहार gcc में बग के कारण होता है ।

उस बग चर्चा की अंतिम टिप्पणी में प्रदान किया गया समाधान कार्य करता है और समस्या को हल करता है:

-Wl,--no-as-needed

8
मैं तुम्हारे बिना एसओ और लोगों के बिना क्या करूंगा? आपने मुझे एक सिर के बालों को खींचने से बचाया। धन्यवाद :) यह उतना ही अस्पष्ट है जितना इसे (मेरे लिए कम से कम)
scorpiodawg

@scorpiodawg: आपकी टिप्पणी ने मेरी शाम बना दी, धन्यवाद :-)
zerkms

1
मुझे -pthread -lpthread -Wl,--no-as-neededयह काम पाने के लिए सभी झंडे जोड़ने थे ।
पैरामैग्नेटिक क्रोइसैंट

33

-lpthreadमेरे लिए समान समस्‍या को जोड़ना :

 g++ -std=c++11 foo.cpp -lpthread -o foo

1
Jep, यह awser है और पूरी तरह से उचित भी है। "-Wl, - नो-एज़-नीड" अजीब लग रहा था और मेरे लिए भी काम नहीं करता है।
थीस

3
आपको जरूर चाहिए -lpthread। संकलक संस्करण के आधार पर आपको आवश्यकता हो सकती है -pthread -Wl,--no-as-neededgcc-4.8.2 को इसकी आवश्यकता है।
cdunn2001

12

मेरे पास थोड़ा और अधिक उन्नत संस्करण है (4.8.1 के बजाय 4.8.4), और मैंने उपरोक्त सभी तीन उत्तरों का परीक्षण किया। असल में:

-pthread अकेले काम करता है:

g ++ -std = c ++ 11 -o main -pthread main.cpp

-Wl,--no-as-neededअकेले काम नहीं करता है

-lpthreadअकेले काम नहीं करता है

-Wl,--no-as-neededऔर -lpthread एक साथ काम:

g ++ -std = c ++ 11 -o main -Wl, - no-as-need main.cpp -lpthread

मेरा संस्करण "g ++ (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.1) 4.8.4" है।


खैर, समाधान विभिन्न संस्करण के लिए प्रदान किए गए थे और मैं आश्वस्त कर सकता हूं कि चेक किए गए उत्तर ने उस समय काम किया था जब मैंने इसे चेक किया था। वैसे भी, वास्तविक जानकारी के लिए धन्यवाद।
झटके

9

उत्तर पहले से ही qtcreator के लिए बनाया गया था:

LIBS += -pthread
QMAKE_CXXFLAGS += -pthread
QMAKE_CXXFLAGS += -std=c++11

कंसोल के लिए g ++: यहाँ

g++ -c main.cpp -pthread -std=c++11         // generate target object file
g++ main.o -o main.out -pthread -std=c++11  // link to target binary

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