Kompilowanie kodu wielowątkowego za pomocą g ++

89

Mam najłatwiejszy kod w historii:

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

chociaż nadal nie mogę go skompilować, g++aby uruchomić.

Więcej szczegółów:

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

Polecenie do kompilacji:

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

Bieganie:

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

A teraz utknąłem. W każdym pokrewnym wątku w Internecie zaleca się dodanie, -pthreadgdy już go mam.

Co ja robię źle?

PS: To zupełnie nowa instalacja Ubuntu 13.10. g++Zainstalowano tylko pakiet i drobne rzeczy, takie jak chromiumitp

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: z clang++(v3.2) kompiluje się i działa dobrze

PPPPS: chłopaki, to nie jest duplikat. Jakie są prawidłowe opcje łącza, aby używać std :: thread w GCC pod Linuksem?

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
źródło
Jest to link symboliczny do libpthread-2.17.sow tym samym katalogu.
zerkms
Tak, to jest poprawny link. Oto mój dir lrwxrwxrwx. 1 root root 18 12 września 20:52 libpthread.so.0 -> libpthread-2.16.so
Jason Enochs
@Jason Enochs: to by działało dla mnie - zgadzam się, gdybym nie używał wersji buggy gcc
zerkms
Tak, wszystkie twoje biblioteki są nieco nowsze niż moje: gcc wersja 4.7.2 20121109 (Red Hat 4.7.2-8) (GCC)
Jason Enochs
@Jason Enochs: hehe. Dla siebie jestem już zadowolony z odpowiedzi "to błąd" i prawdopodobnie spróbuję ją jutro uruchomić na starszym ubuntu, tak dla całkowitej pewności
zerkms

Odpowiedzi:

75

Odpowiedzi udzielił miły członek czatu SO C ++ .

Wygląda na to, że to zachowanie jest spowodowane błędem w gcc.

Obejście przewidziane w ostatnim komentarzu tego błędu dyskusji czyni pracę i rozwiązuje ten problem:

-Wl,--no-as-needed
zerkms
źródło
8
Co bym zrobił bez SO i takich jak ty? Zaoszczędziłeś mi głowy ciągnięcia za włosy. Dzięki :) To jest tak niejasne, jak to tylko możliwe (przynajmniej dla mnie)
scorpiodawg
@scorpiodawg: Twój komentarz uczynił mój wieczór, dzięki :-)
zerkms
1
Musiałem dodać wszystkie -pthread -lpthread -Wl,--no-as-neededflagi, aby uzyskać tę pracę.
Rogalik Paramagnetyczny
34

Dodanie -lpthreadrozwiązało u mnie identyczny problem:

 g++ -std=c++11 foo.cpp -lpthread -o foo
Petr Vepřek
źródło
1
Jep, to jest odpowiedź i całkowicie rozsądne. „-Wl, - nie-w razie potrzeby” brzmiało dziwnie i też nie działa dla mnie.
święta
3
Zdecydowanie potrzebujesz -lpthread. Państwo może potrzebować -pthread -Wl,--no-as-needed, w zależności od wersji kompilatora. gcc-4.8.2 tego potrzebuje.
cdunn2001
12

Mam nieco bardziej zaawansowaną wersję (4.8.4 zamiast 4.8.1) i przetestowałem wszystkie trzy powyższe odpowiedzi. W rzeczywistości:

-pthread sama działa:

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

-Wl,--no-as-neededsam nie działa .

-lpthreadsam nie działa .

-Wl,--no-as-neededi -lpthread razem pracujcie:

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

Moja wersja to „g ++ (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.1) 4.8.4”.

user31264
źródło
Cóż, rozwiązania zostały dostarczone dla innej wersji i zapewniam, że zaznaczona odpowiedź zadziałała w momencie, gdy ją sprawdzałem. W każdym razie dzięki za aktualne informacje.
zerkmy
9

odpowiedź została już utworzona dla qtcreator:

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

dla konsoli g ++: tutaj

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
źródło
1
Dziękuję, Twoja odpowiedź jest jedyną, która wyjaśnia, że ​​-pthread musi zostać przekazany do kompilatora i linkera.
denim