Kompilieren von Multithread-Code mit g ++


88

Ich habe den einfachsten Code aller Zeiten:

#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;
}

obwohl ich es immer noch nicht kompilieren kann, um es g++auszuführen.

Mehr Details:

$ 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.

Befehl zum Kompilieren:

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

Laufen:

$ ./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)

Und jetzt stecke ich fest. In jedem verwandten Thread über das Internet wird empfohlen, hinzuzufügen, -pthreadsolange ich es bereits habe.

Was mache ich falsch?

PS: Es ist eine brandneue Ubuntu 13.10-Installation. Es wurde nur ein g++Paket installiert und kleinere Dinge wie chromiumetc.

PPS:

$ 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: Mit clang++(v3.2) wird es kompiliert und läuft einwandfrei

PPPPS: Leute, es ist kein Duplikat von Was sind die richtigen Linkoptionen , um std :: thread in GCC unter Linux zu verwenden?

PPPPPS:

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

Es ist ein Symlink zu libpthread-2.17.soim selben Verzeichnis.
Zerkms

Ja, das ist ein korrekter Link. Hier ist mein dir lrwxrwxrwx. 1 root root 18 Sep 12 20:52 libpthread.so.0 -> libpthread-2.16.so
Jason Enochs

@ Jason Enochs: Es würde für mich funktionieren - ich stimme zu, wenn ich keine Buggy-
GCC-

Ja, alle Ihre Bibliotheken sind etwas neuer als meine: gcc Version 4.7.2 20121109 (Red Hat 4.7.2-8) (GCC)
Jason Enochs

@ Jason Enochs: hehe. Für mich selbst bin ich bereits mit der Antwort "Es ist ein Fehler" zufrieden und werde wahrscheinlich versuchen, sie morgen auf einem älteren Ubuntu auszuführen, nur um ganz sicher zu sein
zerkms

Antworten:


74

Die Antwort wurde von einem freundlichen Mitglied des SO C ++ - Chats gegeben .

Es sieht so aus, als ob dieses Verhalten durch einen Fehler in gcc verursacht wird.

Die Abhilfe , die in der letzten Kommentar dieser Fehler Diskussion tut Arbeit und löst das Problem:

-Wl,--no-as-needed

8
Was würde ich ohne SO und Leute wie dich tun? Du hast mir eine Menge Haare erspart. Danke :) Das ist so dunkel wie es nur geht (zumindest für mich)
scorpiodawg

@scorpiodawg: Ihr Kommentar machte meinen Abend, danke :-)
zerkms

1
Ich musste alle -pthread -lpthread -Wl,--no-as-neededFlags hinzufügen , um diese Arbeit zu bekommen.
Das paramagnetische Croissant

31

Das Hinzufügen hat -lpthreaddas identische Problem für mich behoben:

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

1
Jep, das ist die Antwort und auch völlig vernünftig. "-Wl, - no-as-need" klang komisch und funktioniert auch bei mir nicht.
Heilige

3
Das brauchst du auf jeden Fall -lpthread. Abhängig von der Compilerversion benötigen Sie möglicherweise-pthread -Wl,--no-as-needed . gcc-4.8.2 braucht es.
cdunn2001

12

Ich habe eine etwas fortgeschrittenere Version (4.8.4 statt 4.8.1) und alle drei Antworten oben getestet. Eigentlich:

-pthread allein funktioniert:

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

-Wl,--no-as-neededallein funktioniert nicht .

-lpthreadallein funktioniert nicht .

-Wl,--no-as-neededund -lpthread zusammen arbeiten:

g ++ -std = c ++ 11 -o main -Wl, - nicht nach Bedarf main.cpp -lpthread

Meine Version ist "g ++ (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.1) 4.8.4".


Nun, die Lösungen wurden für die verschiedene Version bereitgestellt und ich kann versichern, dass die überprüfte Antwort zum Zeitpunkt der Überprüfung funktioniert hat. Trotzdem danke für die eigentlichen Infos.
Zerkms

9

Für qtcreator wurde bereits eine Antwort gegeben:

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

für Konsole g ++: hier

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
Vielen Dank, Ihre Antwort ist die einzige, die klar macht, dass der -pthread an den Compiler und den Linker übergeben werden muss.
Denim
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.