Was sind die richtigen Linkoptionen, um std :: thread in GCC unter Linux zu verwenden?

87

Hallo, ich versuche std::threadmit G ++ zu verwenden. Hier ist mein Testcode

#include <thread>
#include <iostream>

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

Es wird kompiliert, aber wenn ich versuche, es auszuführen, ist das Ergebnis:

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

Meine Compilerversion:

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

Was ist mit meinem Testcode falsch?

UPDATE: Ich verwende die folgende Befehlszeile, um meinen Code zu kompilieren und auszuführen.

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

und ich habe es versucht

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

immer noch das gleiche.

Erdmotor
quelle
7
@Earth Engine: Diese SO-Antwort erklärt, warum es ohne die pthread-Bibliothek keine Linkfehler gibt: stackoverflow.com/a/6266345/12711 Kurze Antwort: glibcHat für viele pthread-Funktionen nichts zu tun.
Michael Burr
@EarthEngine können Sie bitte die Lösung in eine Antwort setzen? Insbesondere -lpthreadmuss das der Quelldatei folgen .
Fluss

Antworten:

101

Ich denke, unter Linux wird pthread zur Implementierung verwendet, std::threaddaher müssen Sie das angeben-pthread Compiler-Option .

Da dies eine Verknüpfungsoption ist, muss diese Compileroption NACH den Quelldateien sein:

$ g++ -std=c++0x test.cpp -pthread
hmjd
quelle
Ich versuche ein sehr einfaches Programm mit gcc 4.7.1 zu kompilieren und habe den gleichen Fehler "Operation nicht erlaubt". Das Problem ist, dass ich bereits das Flag -pthread verwende. Gibt es eine andere Flagge, die Sie kennen?
Filipe
5
Ich habe das Problem behoben, bei dem das "-static" -Flag aus den Linker-Optionen entfernt wurde. Ich weiß nicht, warum dies passiert
Filipe,
Ich frage mich, warum der Compiler beim Kompilieren ohne die Option -lpthread keinen Fehler ausgibt. Irgendjemand??
Zeus2
1
Unter Ubuntu 14.04 g ++ --version (g ++ (Ubuntu / Linaro 4.8.1-10ubuntu9) 4.8.1) musste ich das -W1 hinzufügen, --no-as-need g ++ --std = c ++ 11 -Wl, --keine-nach-Bedarf -pthread main.cc
Begui
1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archivelöst das Problem nicht -pthread. Dies ist Link Problem Link Laut man gcc -pthreadist nur g ++ Optionen, die Multithreading-Unterstützung hinzufügen, die Flags sowohl für den Präprozessor als auch für den Linker setzt
Denis Zaikin
6

Neben der Verwendung -std=c++0x und dürfen -pthreadSie nicht verwenden -static.

Bowie Owens
quelle
3

Hier ist eine einfache CMake-Datei zum Kompilieren eines C ++ 11-Programms, das Threads verwendet:

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)

Eine Möglichkeit, es zu bauen, ist:

mkdir -p build
cd build
cmake .. && make
Alexander
quelle
2
Ihre Lösung ist für mich keine Verbesserung gegenüber der Antwort von hmjd und fügt unnötige Dinge hinzu (Profilerstellung, Testberichterstattung)
Max Beikirch
1

Versuchen Sie, auf diese Weise in einem einzigen Befehl zu kompilieren:

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

Sie können auch C ++ 11 anstelle von gnu ++ 11 ausprobieren. Hoffe das funktioniert.

Ravi Shankar
quelle