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.


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

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.



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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.