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.

Earth Engine
źródło
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
hmjd
źródło
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
6

Oprócz korzystania -std=c++0xi -pthreadnależy nie używać -static.

Bowie Owens
źródło
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
Aleksandra
źródło
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.

Ravi Shankar
źródło