编者注:类似于“程序错误点_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
除外。这是正常的吗?
自动检测按钮也会显示上面的路径。
答案 0 :(得分:52)
我也有这个问题。这为我解决了这个问题:
这应该有用......
答案 1 :(得分:15)
发生这种情况的原因是因为libstdc++-6.dll
目录中也可能存在WINDOWS\System32
(或者可以通过PATH找到它的其他位置)。特别是当你使用不同版本的MingW时。因此,解决方案是以这样的方式更改环境PATH
变量,使MingW\bin
目录位于Windows系统目录之前,将现有版本替换为较新版本或将dll复制到exectuable文件夹
答案 2 :(得分:2)
这些错误是由不匹配的DLL引起的。
对于问题中的消息,它是libstdc++-6.dll
的错误版本,但您可以看到该消息引用了使用各种版本的gcc for Windows构建的其他DLL;甚至提到正在运行的.exe
文件。
这里的具体变化是:
basic_string|char_traits...
- 对于C ++ 11,ABI更改为std::string
__gxx_personality_v0
- 我认为这与正在使用的异常实现有关(Windows的gcc可以使用各种Dwarf2,Win32-SEH,SJLJ等)。如果由一种编译器编译的应用程序链接到由不同风格编译的DLL,您将看到此消息。
要查看可执行文件的已找到DLL的列表,可以在Dependency Walker中打开可执行文件并启用&#34;完整路径&#34;选项。另一种方法是使用ldd
,如果您安装了Cygwin或类似的。
最常见的罪魁祸首是libstdc++-6.dll
。不幸的是,ABI的变化并没有伴随着libstdc ++版本号的变化。并且它不是出现在文件名中的异常模式的默认行为。 (如果你自己建立MinGW,你可以改变这些事情。)
我建议检查Dependency Walker找到的每个DLL,并确保它找到与你构建可执行文件的MinGW相同版本的DLL。 libgcc-s-*.dll
是另一个值得关注的人。
实际上我建议系统路径上没有这些DLL。为了开发,我将一个PATH加载到我编译的同一编译器的DLL中;为了部署,我将DLL与每个可执行文件捆绑在同一目录中,因为运行时DLL搜索总是先检查该目录。然后就没有机会找到碰巧在系统搜索路径上的旧DLL。
答案 3 :(得分:2)
在分析此案例时,我意识到系统路径配置中还有2个版本的libstdc ++-6.dll。一个在mingw64中,另一个在postgres中。
问题在于它们不相同,它们的大小也不同。
我的解决方法很简单:
我将mingw64版本以下的postgres版本下移。
而且效果很好。
答案 4 :(得分:0)
copy libstdc ++ - 6.dll在mingw \ bin中找到windows \ system32 祝你好运