动态链接库libstdc-6.dll中找不到过程入口点_ZNSt8_detail15_List_node_base7_M_hookEPS0_。

6

我有一个小问题。我有一段C++代码,它链接到一些库。我之前从源代码得到了原始的exe文件,在第一台机器上完美运行。然后在第二台机器上修改了源代码等等,构建出来的第二个exe在第二台机器上也能正常工作,但是当我将第二个exe复制到第一台机器上并尝试运行时,会显示以下错误信息:

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

值得注意的是,第二个exe被复制到了与原始exe相同的文件夹中,因此它应该能够看到dll,因为原始dll也在与原始exe相同的文件夹中,不是吗? 它是使用MinGW编译的,在NetBeans中工作,并且在项目属性中添加了库(通过添加库文件),但libstdc++-6.dll并没有被添加进去。而libstdc++-6.dll在原始.exe所在的文件夹中。

谢谢


我不知道可移植库导出的重载名称有多少可靠,但答案大致是“不太可靠”,特别是当动态链接库是由一个编译器构建而消费代码是由另一个编译器构建时。如果您以这种方式混合和匹配二进制文件,可能会遇到问题。 - Rook
1
谢谢,问题很简单,第一台机器上的mingw/bin/目录下有一个更新版本的DLL文件,在将其替换为编译机器上的DLL文件后,程序完美运行...所以我猜测,它首先在路径中搜索DLL文件,然后才在run.exe所在的同一目录中搜索,对吗? - Ell
1个回答

9

我曾经在XP系统中使用MingW遇到了非常类似的问题。

我使用MingW编译了一个12k行的C++项目;在MSYS中运行良好,但是在本机cmd shell中调用时失败,并声称在libstdc++-6.dll中缺少入口点Z_St8_detail15_and_so_on。

相反,下面这个简单的程序在MSYS和cmd中都可以运行:

#include <iostream>

using namespace std ;

class Hello {
  public:
  Hello() { cout << "Hello !" << endl ; }
} ;

Hello hello ;

int main (void) {}

这个程序必须编译与libstdc++(gcc -o hello hello.cpp -lstdc++)一起,如果省略-lstdc++,编译会失败。因此,名称混淆可能不是唯一的问题。

我在资源管理器中搜索了libstdc++-6.dll,并发现我的系统上有两个:一个安装在migw32中,另一个是之前由某个程序安装的,该程序在其目录中拥有自己的版本库。但是,它修改了PATH以便先找到它的库!

我在当前shell中将Mingw所在的路径插入到PATH的开头。类似于:

set PATH=C:\mingw\bin;D:\msys\1.0\local\bin;%PATH%

现在一切运行良好!


Martin,我无法在您的评论中写入内容,因此我编辑了我的留言:

这里解释了Windows如何查找DLL。

祝福你


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