Quali sono le opzioni di collegamento corrette per utilizzare std :: thread in GCC sotto Linux?


87

Ciao, sto cercando di utilizzare std::threadcon G ++. Ecco il mio codice di prova

#include <thread>
#include <iostream>

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

Si compila, ma quando provo a eseguirlo il risultato è:

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

La mia versione del compilatore:

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

Cosa c'è di sbagliato nel mio codice di prova?

AGGIORNAMENTO: utilizzo la seguente riga di comando per compilare ed eseguire il mio codice.

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

e ho provato

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

ancora lo stesso.


7
@Earth Motore: questa risposta SO spiega perché non ci sono errori di collegamento, senza la libreria pthread: stackoverflow.com/a/6266345/12711 Risposta breve: glibcha do-nothing stub per molte funzioni pthread.
Michael Burr

@EarthEngine puoi per favore mettere la soluzione in una risposta? In particolare che -lpthreaddeve seguire il file sorgente.
River

Risposte:


101

Penso che su Linux venga utilizzato pthread per l'implementazione, std::threadquindi è necessario specificare l' -pthreadopzione del compilatore.

Poiché questa è un'opzione di collegamento, questa opzione del compilatore deve essere DOPO i file di origine:

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

Sto cercando di compilare un programma molto semplice usando gcc 4.7.1 e sto riscontrando lo stesso errore di "operazione non consentita". Il problema è che sto già usando -pthread flag. C'è qualche altra bandiera che conosci?
Filipe

6
Ho risolto il problema rimuovendo il flag "-static" dalle opzioni del linker, non so perché questo accade
Filipe

Mi chiedo perché il compilatore non dia un errore durante la compilazione senza l'opzione -lpthread. Qualcuno ??
zeus2

1
Sotto Ubuntu 14.04 g ++ --version (g ++ (Ubuntu / Linaro 4.8.1-10ubuntu9) 4.8.1) ho dovuto aggiungere -W1, --no-as-needed g ++ --std = c ++ 11 -Wl, --no-as-needed -pthread main.cc
Begui

1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archiverisolve il problema, no -pthread. Questo è il collegamento del problema di collegamento Secondo le man gcc -pthreadopzioni g ++ che aggiungono il supporto multithreading che imposta i flag sia per il preprocessore che per il linker
Denis Zaikin

6

Oltre a utilizzare -std=c++0xe -pthreadsi deve , non utilizzare -static.



2

Ecco un semplice file CMake per compilare un programma C ++ 11 che utilizza i thread:

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)

Un modo per costruirlo è:

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

2
La tua soluzione non è un miglioramento rispetto alla risposta di hmjd per me e aggiunge cose non necessarie (profilazione, copertura dei test)
Max Beikirch

1

Prova a compilare in questo modo in un unico comando:

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

Puoi anche provare C ++ 11 invece di gnu ++ 11. Spero che funzioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.