Quelles sont les bonnes options de lien pour utiliser std :: thread dans GCC sous Linux?

87

Salut, j'essaye d'utiliser std::threadavec G ++. Voici mon code de test

#include <thread>
#include <iostream>

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

Il compile, mais lorsque j'essaye de l'exécuter, le résultat est:

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

Ma version de compilateur:

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

Quel est le problème avec mon code de test?

MISE À JOUR: J'utilise la ligne de commande suivante pour compiler et exécuter mon code.

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

et j'ai essayé

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

Toujours le même.

Moteur de la Terre
la source
7
@Earth Engine: cette réponse SO explique pourquoi il n'y a pas d'erreurs de lien sans la bibliothèque pthread: stackoverflow.com/a/6266345/12711 Réponse courte: glibca des stubs à ne rien faire pour de nombreuses fonctions pthread.
Michael Burr
@EarthEngine pouvez-vous s'il vous plaît mettre la solution dans une réponse? Plus précisément, le -lpthreaddoit suivre le fichier source.
Rivière

Réponses:

101

Je pense que sur Linux, pthread est utilisé pour implémenter std::thread, vous devez donc spécifier l' -pthreadoption du compilateur.

Comme il s'agit d'une option de liaison, cette option du compilateur doit être APRÈS les fichiers source:

$ g++ -std=c++0x test.cpp -pthread
hmjd
la source
J'essaie de compiler un programme très simple en utilisant gcc 4.7.1 et j'ai la même erreur "opération non autorisée". Le problème est que j'utilise déjà l'option -pthread. Connaissez-vous un autre drapeau?
Filipe
5
J'ai résolu le problème en supprimant le drapeau "-static" des options de l'éditeur de liens, je ne sais pas pourquoi cela se produit
Filipe
Je me demande pourquoi le compilateur ne donne pas d'erreur lors de la compilation sans l'option -lpthread. N'importe qui??
zeus2
1
Sous Ubuntu 14.04 g ++ --version (g ++ (Ubuntu / Linaro 4.8.1-10ubuntu9) 4.8.1) j'ai dû ajouter le -W1, --no-as-need g ++ --std = c ++ 11 -Wl, --no-as-needed -pthread main.cc
Begui
1
-Wl,--whole-archive -lpthread -Wl,--no-whole-archiverésout le problème, non -pthread. Ceci est un problème de lien Lien Selon ce man gcc -pthreadn'est que des options g ++ qui ajoutent un support multithreading qui définit des indicateurs à la fois pour le préprocesseur et l'éditeur de liens
Denis Zaikin
6

En plus d'utiliser -std=c++0xet -pthreadvous ne devez pas utiliser -static.

Bowie Owens
la source
3

Voici un simple fichier CMake pour compiler un programme C ++ 11 qui utilise des threads:

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)

Une façon de le construire est:

mkdir -p build
cd build
cmake .. && make
Alexandre
la source
2
Votre solution n'est pas une amélioration par rapport à la réponse de hmjd pour moi et ajoute des choses unnessary (profilage, test-couverture)
Max Beikirch
1

Essayez de compiler de cette façon en une seule commande:

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

Vous pouvez également essayer C ++ 11 au lieu de gnu ++ 11. J'espère que cela fonctionne.

Ravi Shankar
la source