入口点未找到

10

在尝试运行一个应用程序时,我遇到了一个奇怪的错误(这个应用程序已经有一段时间没有改变代码,因为它一直工作得很好),它链接到我的 DLL。这个 DLL 以前是可以工作的,但是我对 DLL 的代码进行了一些更改,并成功编译了它。不幸的是,在尝试运行应用程序时...

---------------------------
GameTest001.exe - Entry Point Not Found
---------------------------
The procedure entry point ??0Music@@QAE@ABV0@@Z could not be located in the dynamic link library Renderer02.dll. 
---------------------------
OK   
---------------------------

我不知道如何解释这个错误。我知道我所做的更改,而且我认为我的代码没有问题。我尝试谷歌搜索过,但是一点儿也没有帮助。

有人能提供任何见解吗?这个错误是什么意思?

4个回答

6
您正在链接到一个以混淆名称导出的函数,该名称为??0Music@@QAE@ABV0@@Z。被加载的DLL没有导出这个名称的函数,因此会出现错误。
名称混淆编码了函数的名称、参数和返回值。因此,不匹配的最可能原因是您在一个地方更改了函数的名称、参数或返回值,但在另一个地方没有更改。
如果您已更改了DLL,则需要重新编译它以生成新的.lib和.dll文件。您还将修改.h文件。确保程序链接到DLL时使用了所有三个文件的修改版本。
这个错误消息实际上对您有帮助,因为它会确保在执行代码之前两侧的接口匹配。
更新:
我在上面的文本中没有表述清楚。每当您更改DLL的接口时,必须执行以下操作:
1. 更新应用程序使用的任何.h文件。 2. 重新编译DLL以生成新的.lib和.dll文件。 3. 使用更新的.lib和.h文件重新编译应用程序。 4. 分发新的.dll文件,以便更新的应用程序加载更新的DLL。

我已经多次重建了DLL和其lib文件,但都没有效果。然而,似乎我实际上需要重新构建应用程序,这个应用程序已经使用了每个新版本的DLL数周之久,而我一直没有需要重新构建它。 - Interminable
是的,这就是我说的。您已更改了 DLL,因此为了使用新的 .dll 文件,您需要使用新版本的 .h 和 .lib 文件编译应用程序。 - David Heffernan
你没有提到我需要重新编译应用程序(对 DLL 的先前更改并不需要重新编译应用程序)。 - Interminable
1
当然,我已经做到了:“确保程序链接到动态链接库时使用所有三个文件的修改版本。”你必须意识到需要使接口的两侧匹配。如果您更改其中一个,则必须更改另一个以进行匹配。您之前对DLL所做的更改没有更改接口,只是实现。 - David Heffernan
啊,我想我知道可能发生了什么。虽然我过去曾为此DLL创建新的头文件,但是应用程序从未调用(或最初使用)任何新的头文件等。但是,最近我在DLL的另一个部分中重命名了一个.h文件,然后创建了一个具有相同名称但具有不同功能的新文件。这两个文件都没有声明或定义“Music”类,但其中一个确实使用了它。我猜测更改使用此.h文件的方式可能是导致此问题的原因? - Interminable
显示剩余3条评论

3

似乎你的dll缺少Music::Music(class Music const &)函数。 ??0Music@@QAE@ABV0@@Z是该函数的名称混淆后的表示。你可以使用这个网站来还原函数名称。


符号重整并不能解决问题。解决方案是确保 DLL 和应用程序匹配。 - David Heffernan
3
是的,但是了解解码后的内容仍然是有用的,对吧? - Interminable
1
有时解缠名称很有用,但如果你真的想解决问题,就需要理解哪些文件是输入到动态链接库 (DLL) 中的,哪些是 DLL 编译输出的。同样的道理也适用于应用程序。你需要明白,接口有两个方面需要匹配。而且你必须了解,当你改变一个接口的一侧时,必须同时修改另一侧以保持一致。解缠名称并不涉及其中任何一部分。 - David Heffernan

2

请仔细检查编译器标志,看看是否包括-static-libstdc++。如果是这种情况,您需要重新构建应用程序。


0

在你的C++代码中尝试这个

extern "C"
{
   inline  __declspec(dllexport)  int MyFunction()
  {
     return  63;
  }
}

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