Jakie są poprawne opcje linków, aby używać std :: thread w GCC pod Linuksem?


87

Cześć, próbuję używać std::threadz G ++. Oto mój kod testowy

#include <thread>
#include <iostream>

int main(int, char **){
    std::thread tt([](){ std::cout<<"Thread!"<<std::endl; });
    tt.join();
}

Kompiluje się, ale kiedy próbuję go uruchomić, wynikiem jest:

terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted 
Aborted

Wersja mojego kompilatora:

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

Co jest nie tak z moim kodem testowym?

AKTUALIZACJA: Używam następującego wiersza poleceń do kompilowania i uruchamiania kodu.

$ g++ -std=c++0x test.cpp
$ ./a.out

i próbowałem

$ g++ -std=c++0x -lpthread test.cpp
$ ./a.out

wciąż ten sam.


7
@Earth Engine: ta odpowiedź SO wyjaśnia, dlaczego nie ma błędów linków bez biblioteki pthread: stackoverflow.com/a/6266345/12711 Krótka odpowiedź: glibczawiera kody pośredniczące dla wielu funkcji pthread.
Michael Burr,

@EarthEngine Czy możesz podać rozwiązanie w odpowiedzi? W szczególności -lpthreadmusi następować po pliku źródłowym.
River

Odpowiedzi:


101

Myślę, że w Linuksie pthread jest używany do implementacji, std::threadwięc musisz określić-pthread opcję kompilatora.

Ponieważ jest to opcja łączenia, ta opcja kompilatora musi być ZA plikami źródłowymi:

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

Próbuję skompilować bardzo prosty program przy użyciu gcc 4.7.1 i mam ten sam błąd „operacja niedozwolona”. Problem w tym, że już używam flagi -pthread. Czy jest jakaś inna flaga, o której wiesz?
Filipe

5
Rozwiązałem problem usuwając flagę „-static” z opcji linkera, nie wiem dlaczego tak się dzieje
Filipe

Zastanawiam się, dlaczego kompilator nie wyświetla błędu podczas kompilacji bez opcji -lpthread. Ktoś??
zeus2

1
Pod Ubuntu 14.04 g ++ --version (g ++ (Ubuntu / Linaro 4.8.1-10ubuntu9) 4.8.1) musiałem dodać -W1, --no-as-potrzeba g ++ --std = c ++ 11 -Wl, --no-as-need -pthread main.cc
Begui

1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archiverozwiązuje problem, a nie -pthread. To jest link do problemu z łączem Według man gcc -pthreadto tylko opcje g ++, które dodają obsługę wielowątkowości, która ustawia flagi zarówno dla preprocesora, jak i konsolidatora
Denis Zaikin



2

Oto prosty plik CMake do kompilowania programu w C ++ 11 używającego wątków:

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)

Jednym ze sposobów budowy jest:

mkdir -p build
cd build
cmake .. && make

2
Twoje rozwiązanie nie jest poprawą w stosunku do odpowiedzi hmjd dla mnie i dodaje rzeczy unnessary (profilowanie, pokrycie testów)
Max Beikirch

1

Spróbuj skompilować w ten sposób w jednym poleceniu:

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

Możesz także wypróbować C ++ 11 zamiast gnu ++ 11. Mam nadzieję, że to zadziała.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.