35

编者按:类似“程序错误点_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_无法在动态链接库中定位”的错误信息,libstdc++-6.dll原因相同,解决方法相同。


如果我想在 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. 这正常吗?

自动检测按钮还建议上面的路径。

4

5 回答 5

64

我也有这个问题。这为我修复了它:

  1. 转到您的 MinGW 文件夹(应该是 C:\MinGW)
  2. 打开 bin 文件夹。
  3. 应该有一个名为 libstdc++-6.dll 的文件
  4. 将其复制到与可执行文件相同的目录中。

那应该工作...

于 2013-12-08T15:40:19.770 回答
15

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

于 2014-04-03T12:35:56.940 回答
4

这些错误是由不匹配的 DLL 引起的。

对于问题中的消息,它是不正确的版本libstdc++-6.dll,但您可以看到该消息指的是使用 Windows 的各种版本的 gcc 构建的其他 DLL;甚至提到.exe正在运行的文件。

这里的具体变化是:

  • basic_string|char_traits...- 对于 C++11,有一个突破性的 ABI 更改为std::string
  • __gxx_personality_v0- 我相信这与正在使用的异常实现有关(Windows 的 gcc 可以使用各种 Dwarf2、Win32-SEH、SJLJ 等)

如果由一种编译器编译的应用程序链接到由不同编译器编译的 DLL,您将看到此消息。

要查看已找到可执行文件的 DLL 列表,您可以在 Dependency Walker 中打开可执行文件并启用“完整路径”选项。ldd如果您安装了 Cygwin 或类似的,另一种方法是使用。

最常见的罪魁祸首是libstdc++-6.dll. 不幸的是,ABI 的变化并没有与 libstdc++ 版本号的变化相结合。并且它不是异常模式出现在文件名中的默认行为。(如果您自己构建 MinGW,您可以更改这些内容)。

我建议检查 Dependency Walker 找到的每个 DLL,并确保它从与您构建可执行文件的同一版本的 MinGW 中找到那些。libgcc-s-*.dll是另一个需要注意的。

事实上,我建议不要在系统路径上包含任何这些 DLL。为了开发,我为我正在编译的同一个编译器加载了一个 DLL 的路径;对于部署,我将 DLL 捆绑在与每个可执行文件相同的目录中,因为运行时 DLL 搜索总是首先检查该目录。那么就没有机会找到恰好位于系统搜索路径上的旧 DLL。

2019 年更新这些天我倾向于使用静态链接,因为部署更大的文件比陷入 DLL 地狱问题要小)。

也可以看看:

于 2017-11-14T20:57:56.627 回答
2

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

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

我的解决方案很简单:
我将 postgres 的版本降低到 mingw64 版本以下。而且效果很好。

于 2019-08-31T07:53:33.867 回答
0

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

于 2016-05-01T18:34:42.783 回答