Compilation de code multithread avec g ++

88

J'ai le code le plus simple qui soit:

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

bien que je ne puisse toujours pas le compiler avec g++pour l'exécuter.

Plus de détails:

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

Commande à compiler:

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

Fonctionnement:

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

Et maintenant je suis coincé. Dans chaque fil lié sur Internet, il est recommandé d'ajouter -pthreadpendant que je l'ai déjà.

Qu'est-ce que je fais mal?

PS: C'est une toute nouvelle installation ubuntu 13.10. Seul le g++package a été installé et des choses mineures comme 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: avec clang++(v3.2) il se compile et fonctionne correctement

PPPPS: les gars, ce n'est pas un double de Quelles sont les bonnes options de lien pour utiliser std :: thread dans GCC sous Linux?

PPPPPS:

$ dpkg --get-selections | grep 'libc.*dev'
libc-dev-bin                    install
libc6-dev:amd64                 install
libclang-common-dev             install
linux-libc-dev:amd64                install
zerkms
la source
C'est un lien symbolique vers libpthread-2.17.sodans le même répertoire.
zerkms
Oui, c'est un lien correct. Voici mon dir lrwxrwxrwx. 1 racine racine 18 septembre 12 20:52 libpthread.so.0 -> libpthread-2.16.so
Jason Enochs
@Jason Enochs: cela fonctionnerait pour moi - je suis d'accord, si je n'utilisais pas la version buggy gcc
zerkms
Oui, toutes vos bibliothèques sont un peu plus récentes que les miennes: gcc version 4.7.2 20121109 (Red Hat 4.7.2-8) (GCC)
Jason Enochs
@Jason Enochs: hehe. Pour moi, je suis déjà satisfait de la réponse "c'est un bug", et j'essaierai probablement de l'exécuter sur un ancien ubuntu demain, juste pour être complètement sûr
zerkms

Réponses:

74

La réponse a été fournie par un membre aimable du chat SO C ++ .

Il semble que ce comportement soit causé par un bogue dans gcc.

La solution de contournement fournie dans le dernier commentaire de cette discussion de bogue fait travail et résout le problème:

-Wl,--no-as-needed
zerkms
la source
8
Que ferais-je sans SO et des gars comme vous? Vous m'avez sauvé une tête de tirage de cheveux. Merci :) C'est aussi obscur que possible (pour moi du moins)
scorpiodawg
@scorpiodawg: votre commentaire a fait ma soirée, merci :-)
zerkms
1
J'ai dû ajouter tous les -pthread -lpthread -Wl,--no-as-neededdrapeaux pour obtenir ce travail.
Le Croissant Paramagnétique
32

L'ajout a -lpthreadrésolu le problème identique pour moi:

 g++ -std=c++11 foo.cpp -lpthread -o foo
Petr Vepřek
la source
1
Jep, c'est la réponse et aussi tout à fait raisonnable. "-Wl, - no-as-needed" avait l'air bizarre et ne fonctionne pas non plus pour moi.
thesaint
3
Vous en avez vraiment besoin -lpthread. Vous pourriez avoir besoin -pthread -Wl,--no-as-needed, selon la version du compilateur. gcc-4.8.2 en a besoin.
cdunn2001
12

J'ai une version légèrement plus avancée (4.8.4 au lieu de 4.8.1), et j'ai testé les trois réponses ci-dessus. En réalité:

-pthread seul fonctionne:

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

-Wl,--no-as-neededseul ne fonctionne pas .

-lpthreadseul ne fonctionne pas .

-Wl,--no-as-neededet travailler -lpthread ensemble :

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

Ma version est "g ++ (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.1) 4.8.4".

user31264
la source
Eh bien, les solutions ont été fournies pour la version différente et je peux vous assurer que la réponse vérifiée a fonctionné au moment où je l'ai vérifiée. Quoi qu'il en soit, merci pour les informations réelles.
zerkms
9

la réponse a déjà été faite pour qtcreator:

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

pour console g ++: ici

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
ecoretchi
la source
1
Merci, votre réponse est la seule qui indique clairement que le -pthread doit être passé au compilateur et à l'éditeur de liens.
denim