web-dev-qa-db-fra.com

le point d'entrée de procédure __gxx_personality_v0 n'a pas pu être localisé

Note de l'éditeur: Des messages d'erreur similaires à "Le point d'erreur de procédure _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_ n'a pas pu être localisé dans la bibliothèque de liens dynamiques libstdc++-6.dll" ont la même cause et les mêmes solutions s'appliquent.


Je continue à recevoir cette erreur si je veux exécuter mon application de console Irrlicht C++ sous Windows:

the procedure entry point __gxx_personality_v0 could not be located in the dynamic link library libstdc++-6.dll

J'utilise CodeBlocks v12.11 avec MinGW et le moteur Irrlicht v1.8. Je l'ai configuré correctement. Sur mon ordinateur, un Qt est également installé avec MinGW. Est-il possible qu'il y ait un conflit?

C'est le code source:

#include <irrlicht.h>

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

int main() {
    IrrlichtDevice *device = createDevice( video::EDT_OPENGL);

    if (!device)
        return 1;

    IVideoDriver* driver = device->getVideoDriver();
    ISceneManager* smgr = device->getSceneManager();
    IGUIEnvironment* guienv = device->getGUIEnvironment();

    guienv->addStaticText(L"Hello World", core::recti(10, 10, 100, 30));
    device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");

    while(device->run()) {
        driver->beginScene(true, true, SColor(250, 190, 1, 2));
        smgr->drawAll();
        guienv->drawAll();
        driver->endScene();
    }

    device->drop();
    return 0;
}

J'ai configuré le compilateur sur C:\CodeBlocks\MinGW. Chaque fichier (certains sont indiqués dans les paramètres) se trouve sous bin, à l'exception de make.exe. Est-ce normal?

Le bouton de détection automatique suggère également le chemin ci-dessus.

26
Niklas

J'ai eu ce problème aussi. Cela a résolu le problème pour moi:

  1. Allez dans votre dossier MinGW (devrait être C:\MinGW)
  2. Ouvrez le dossier bin.
  3. Il devrait y avoir un fichier appelé libstdc ++ - 6.dll
  4. Copiez-le dans le même répertoire que votre exécutable.

Cela devrait fonctionner...

49
user2947761

Cela s’explique par le fait qu’il peut également y avoir un libstdc++-6.dll dans le répertoire WINDOWS\System32 (ou à un autre emplacement où il peut être trouvé via PATH). Surtout quand vous utilisez différentes versions de MingW. La solution consiste donc à modifier la variable d'environnement PATH de manière à ce que votre répertoire MingW\bin soit avant le répertoire système Windows, remplacez la version existante par la nouvelle version ou copiez la dll dans le dossier exectuable.

15
Devolus

Ces erreurs sont dues à des DLL incompatibles. 

Pour les messages de la question, il s'agit d'une version incorrecte de libstdc++-6.dll, mais vous pouvez voir le message faisant référence à d'autres DLL construites avec différentes versions de gcc pour Windows. et même en mentionnant le fichier .exe en cours d'exécution. 

Les changements spécifiques ici sont:

  • basic_string|char_traits... - pour C++ 11, un changement ABI exceptionnel est passé à std::string
  • __gxx_personality_v0 - Je pense que cela est lié à la mise en œuvre des exceptions (gcc pour Windows peut utiliser divers types de Dwarf2, Win32-SEH, SJLJ, etc.)

Vous verrez ce message si une application compilée par un type de compilateur est liée à une DLL compilée par un autre type. 

Pour voir une liste des DLL trouvées pour un fichier exécutable, vous pouvez ouvrir le fichier exécutable dans Dependency Walker et activer l'option "Chemins complets". Une autre méthode consiste à utiliser ldd si Cygwin ou un logiciel similaire est installé.

Le coupable le plus courant est libstdc++-6.dll. Malheureusement, le changement d'ABI n'a pas été associé à un changement de numéro de version de libstdc ++; et ce n'est pas le comportement par défaut pour que le mode exception apparaisse dans le nom du fichier. (Vous pouvez changer ces choses si vous construisez vous-même MinGW).

Je vous recommande de vérifier chaque DLL trouvée par Dependency Walker et de vous assurer qu'elle trouve celles de la même version de MinGW que celle avec laquelle vous avez construit votre exécutable. libgcc-s-*.dll est un autre à rechercher.

En fait, je vous conseillerais de ne pas avoir ces DLL sur le chemin système. Pour le développement, je charge un PATH dans les DLL du même compilateur avec lequel je compile; et pour le déploiement, j'associe les DLL dans le même répertoire que chaque exécutable, car la recherche d'exécution DLL vérifie toujours ce répertoire en premier. Il n'y a alors aucune chance de trouver un ancien DLL qui se trouve sur un chemin de recherche système.

2
M.M

copier libstdc ++ - 6.dll trouvé dans mingw\bin vers windows\system32 bonne chance

0
taki