过程入口点__gxx_personality_v0无法定位

37

编辑注:类似于“在动态链接库libstdc++-6.dll中找不到过程错误点_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_”的错误消息具有相同的原因,相同的解决方法适用。


如果我想在Windows中运行我的Irrlicht C ++控制台应用程序,就会一直收到此错误:

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

我正在使用CodeBlocks v12.11带有MinGW和Irrlicht v1.8引擎。我正确地设置了它。在我的计算机上也安装了一个带有MinGW的Qt。可能存在冲突吗?

这是源代码:

#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;
}

我将编译器配置为C:\CodeBlocks\MinGW。 每个文件(在设置中有一些显示)都位于bin下,除了make.exe。这正常吗?

自动检测按钮也建议使用上述路径。


你记得在链接器选项卡下编辑设置->搜索目录吗?(这样链接器才能找到二进制文件。) - ryyker
5个回答

65

我之前也遇到过这个问题。以下方法解决了我的问题:

  1. 进入你的MinGW文件夹(一般在C:\MinGW)
  2. 打开bin文件夹
  3. 应该会有一个名为libstdc++-6.dll的文件
  4. 将它复制到你的可执行文件所在的同一目录下

这样应该就可以解决问题了...


4
很好的答案,帮我省了大量精力。 - Stefano Mtangoo
如果在MinGW文件夹中没有libstdc++-6.dll,我该怎么办? - StefanTflch
虽然这有点像霍布森的选择。将1M的dll复制到可执行文件所在的目录,或者在strip -s之后使用500K的可执行文件。(实际上,复制dll会增加总体积) - David C. Rankin
请注意,另一种选择是使用静态链接,这样您的二进制文件就不会依赖于这些 DLL。 - M.M
如果有人发现了这个解决方案来修复问题,仍然要小心,因为二进制文件可能还依赖于其他DLL(例如libgcc_slibwinpthread),如果使用错误的版本,则在运行时可能会出现更微妙的问题--我建议确保检查所有依赖项,请参见我的答案以获取详细信息。 - M.M
@StefanTflch,它应该在那里,你在\bin目录下了吗? - Le mouton vert

15
这种情况发生的原因是因为 libstdc++-6.dll 可能也存在于 WINDOWS\System32 目录中(或者在一些其他可以通过 PATH 找到的位置)。特别是当您使用不同版本的 MingW 时。因此,解决方案要么是以这样的方式更改环境变量 PATH,使您的 MingW\bin 目录先于 Windows 系统目录,要么用新版本替换现有版本,或将 dll 复制到可执行文件夹中。

我建议从系统路径中删除MinGW DLL,并在每个部署的可执行文件中部署正确的版本。虽然会使用更多的磁盘空间,但不会出现这种问题。 - M.M
libstdc++-6.dll 的副本也可以存储在 Git 的安装目录下的 mingw64\bin 和/或 mingw64\libexec\git-core 中。我只是删除了这些文件,g++git 仍然可以正常工作。 - SomeMosa

4
这些错误是由不匹配的DLL引起的。
对于问题中的消息,引起错误的是一个不正确版本的libstdc++-6.dll,但您可以看到消息还涉及其他使用不同版本的gcc for Windows构建的DLL,并且甚至提到正在运行的.exe文件。
具体更改如下:
  • basic_string|char_traits... - 对于C++11,std::string进行了破坏性ABI更改。
  • __gxx_personality_v0 - 我认为这与使用哪种异常实现有关(gcc for Windows可以使用Dwarf2、Win32-SEH、SJLJ等)。
如果一个由一种编译器版本编译的应用程序链接到由不同版本编译的DLL,则会看到此消息。
要查看可执行文件找到的DLL列表,您可以在Dependency Walker中打开可执行文件并启用"Full Paths"选项。另一种方法是如果您安装了Cygwin或类似的软件,则可以使用ldd命令。
最常见的罪魁祸首是libstdc++-6.dll。不幸的是,ABI更改没有与libstdc++的版本号更改配套; 并且异常模式不是出现在文件名中的默认行为。 (如果自己构建MinGW,则可以更改这些内容)。
我建议检查Dependency Walker找到的每个DLL,并确保它们都来自使用MinGW编译可执行文件的相同版本。 libgcc-s-*.dll也是要注意的另一个DLL。
事实上,我建议不在系统路径上放置任何这些DLL。对于开发,我加载与我正在编译的编译器相同的DLL路径; 对于部署,我将DLL捆绑在每个可执行文件所在的同一目录中,因为运行时DLL搜索总是首先检查该目录。然后就没有机会找到旧的DLL,因为它恰好位于系统搜索路径上。
(更新2019年:现在我倾向于使用静态链接,因为部署更大的文件比陷入DLL地狱问题更少成为问题)。
另请参阅:

2

当我分析我的情况时,我意识到系统路径配置中有2个更多版本的libstdc++-6.dll。一个在mingw64中,另一个在postgres中。

问题是它们不相同,它们的大小也不同。

我的解决方法很简单:
我将postgres版本下移至mingw64版本以下。 这样就可以完美地解决问题了。


0

将在mingw\bin中找到的libstdc++-6.dll复制到windows\system32中,祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接