Comment faire de la CDT/Eclipse travailler avec C++11 fils?
J'ai essayé de tester un exemple de C++11 fils dans Eclipse. Mais j'ai eu ce message lors de l'exécution du programme:
résilier appelé après avoir jeté une instance de 'std::system_error'
quel (le): Opération non permise'
Mon système: ubuntu + gcc 4.7
Programme:
#include <iostream>
#include <thread>
void worker()
{
std::cout << "hello from worker" << std::endl;
}
int main(int argc, char **argv)
{
std::thread t(worker);
t.join();
}
...et oui, j'ai mis -std=c++11
et -pthread
à l'intérieur de C/C++ Build -> Settings -> Tool Settings -> Cross G++ Compiler -> Miscellaneous -> Other Flags
.
Des commentaires?
Semble étrange de mettre ces paramètres dans un "cross compilateur" (mais je ne sais pas Eclipse). Le crash est répétable si le
C'est une exception d'exécution, de sorte que le code compile correctement. Encore, je ne comprends pas les cas dans lesquels cette exception message doit se produire...
cette erreur arrive si vous link contre le mauvais libstdc++, ce qui peut se produire si vous avez plusieurs versions de celui-ci installé et que vous ne passez pas
Je pense que
Cette erreur arrive vraiment quand
-pthread
drapeau n'est pas présent sur la ligne de commande et que vous avez d'autres versions de libstdc++ est installé. Donc, assurez-vous que le drapeau est vraiment passé à votre compilateurC'est une exception d'exécution, de sorte que le code compile correctement. Encore, je ne comprends pas les cas dans lesquels cette exception message doit se produire...
cette erreur arrive si vous link contre le mauvais libstdc++, ce qui peut se produire si vous avez plusieurs versions de celui-ci installé et que vous ne passez pas
-pthread
(ou votre installation GCC est complètement foireuse)Je pense que
-pthread
est passé à compilateur, parce que je l'ai mis dans le même endroit que j'ai mis -std=c++11
, et le code ne sera pas compilé quand je n'ai pas mis -std=c++11
. Plus étrange, c'est que le code fonctionne correctement lorsque je le compile en ligne de commande manuellement.Cette erreur arrive vraiment quand
-pthread
n'est pas utilisé (même si vous avez seulement une libstdc++ est installé). Assurez-vous que -pthread
est utilisé pour la commande du compilateur et l'éditeur de liens de commande. Sinon libpthread.ne sera donc pas lié au nombre de threads et ne peut pas être lancé au moment de l'exécution.OriginalL'auteur melmi | 2012-05-01
Vous devez vous connecter pour publier un commentaire.
Le problème a été résolu par le commentaire de Jonathan Wakely.
J'ai ajouté
-pthread
àC/C++ Build -> Settings -> Tool Settings -> Cross G++ **Linker** -> Miscellaneous -> Other Flags
et le programme fonctionnait correctement.Merci Jonathan.
... -> CCC C++ Linker -> Miscellaneous -> Linker flags
hmm, que fait mon programme de run & debug okey dans eclipse, mais le vérificateur de syntaxe me donne encore des erreurs lorsque j'utilise std::thread ou thread.rejoignez. Quelqu'un sait comment résoudre ce trop?
OriginalL'auteur melmi
De travail C++11
std::thread
dans Eclipse, on doit donner-pthread
option lors de la compilation. Cependant ce n'est pas assez. Dans mon Ubuntu 14.04, avec Eclipse Kepler et g++4.9 ci-dessous permet de travailler:et d'ajouter
-pthread
après-std=c++11
et d'ajouter
pthread
(qui est l'équivalentpour la ligne de commande
-lpthread
)Enfin re-compiler le projet; l'erreur devrait aller.
Rappelez-vous aussi que si vous utilisez,
std::thread
puis, son objet doit êtrejoin()
quelque part. Bien que vous pourriez obtenir en dessous d'erreur à l'exécution:OriginalL'auteur iammilind
Aller à Projet > Propriétés > C/C++ Général > Préprocesseur inclure des chemins d'accès, etc > Fournisseurs > CDT GCC Builtin les Paramètres du Compilateur et ajouter
-std=c++11
pour le compilateur de spécifications.Vous pouvez également le faire pour tous les projets va Fenêtre > Préférences > C/C++ > Build > Paramètres > Découverte et ajouter
-std=c++11
à la CDT GCC Builtin les Paramètres du Compilateur specs.Propriétés de projet > C/C++ Build > Paramètres > Paramètres de l'Outil > GCC Compilateur C++ > Divers > d'Autres indicateurs, ajouter
-pthread -std=c++11 -Wl,--no-as-needed
:Propriétés de projet > C/C++ Build > Paramètres > Paramètres de l'Outil > GCC C++ Linker > Divers > Linker drapeaux, ajouter
-pthread -std=c++11 -Wl,--no-as-needed
OriginalL'auteur robbycandra