未找到入口点

Posted

技术标签:

【中文标题】未找到入口点【英文标题】:Entry Point Not Found 【发布时间】:2013-06-16 18:21:58 【问题描述】:

我在尝试运行链接到我的 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   
---------------------------

我不知道如何解释这个错误。我知道我做了哪些更改,而且我的代码对我来说看起来不错。我试过用谷歌搜索,但一点运气都没有。

任何人都可以对此有所了解吗?这个错误是什么意思?

【问题讨论】:

【参考方案1】:

您正在链接到一个已导出的函数,该函数的名称已损坏,该名称为??0Music@@QAE@ABV0@@Z。正在加载的 DLL 不会导出该名称的函数,因此会出现错误。

名称修饰对函数的名称、参数和返回值进行编码。因此,不匹配的最可能原因是您在一个地方更改了函数的名称、参数或返回值,而在另一个地方没有更改。

如果您更改了 DLL,则需要重新编译它以生成新的 .lib 和 .dll 文件。您还将修改 .h 文件。确保链接到 DLL 的程序使用所有这三个文件的修改版本。

此错误消息实际上对您很有帮助,因为它将确保界面的两侧匹配,然后您才能继续执行代码。

更新

我在上面的文字中说得不够清楚。每当您更改 DLL 的接口时,您必须执行以下操作:

    更新应用程序使用的所有 .h 文件。 重新编译 DLL 以生成新的 .lib 和 .dll 文件。 使用更新的 .lib 和 .h 文件重新编译应用程序。 分发新的 .dll 文件,以便更新的应用程序加载更新的 DLL。

【讨论】:

我多次重建 DLL 及其 lib 文件,但无济于事。但是,似乎我实际上需要重新构建我已经使用了每个新版本的 DLL 的几周都不需要重新构建的应用程序。 是的,我就是这么说的。您已经更改了 DLL,因此为了使用新的 .dll 文件,您需要使用新版本的 .h 和 .lib 文件来编译应用程序。 您没有提到我还需要重新编译应用程序(之前对 DLL 的更改不需要重新编译应用程序)。 我确实做到了:“确保所有这三个文件的修改版本都被链接到 DLL 的程序使用。”你必须意识到你需要让界面的两边都匹配。如果你改变一个,你必须改变另一个来匹配。您之前对 DLL 的更改并未更改接口,仅更改了实现。 啊,我想我知道当时可能发生了什么。尽管我过去为这个 DLL 创建了新的头文件,但应用程序从未调用(或最初使用)任何新的头文件等。但是,我最近在 DLL 的另一部分重命名了一个 .h 文件,然后创建了一个具有相同名称(但功能不同)的新文件。这两个文件没有声明或定义Music 类,但其中一个确实使用了它。这个.h文件的用途改变了,我猜可能是什么原因造成的?【参考方案2】:

您的 dll 中似乎缺少函数 Music::Music(class Music const &)??0Music@@QAE@ABV0@@Z 是这个函数的名称。您可以使用this site 对函数名称进行分解。

【讨论】:

拆解不能解决问题。解决方案是确保 DLL 和应用程序匹配。 是的,但是知道解构后的东西实际上是什么仍然有用,确定吗? 有时去重很有用,但如果您真的想解决您的问题,您需要了解哪些文件输入到 DLL,哪些文件作为 DLL 编译的输出生成。对于应用程序也是如此。您需要了解您有两个需要匹配的界面。而且您需要了解,当您更改界面的一侧时,您必须更改另一侧以匹配。拆除不是其中的一部分。【参考方案3】:

再次查看编译器标志以检查是否包含 -static-libstdc++。在这种情况下,您必须重新构建应用程序。

【讨论】:

【参考方案4】:

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

extern "C"

   inline  __declspec(dllexport)  int MyFunction()
  
     return  63;
  

【讨论】:

以上是关于未找到入口点的主要内容,如果未能解决你的问题,请参考以下文章

未找到 httpd.exe 入口点

C# 无法在未损坏的 C++ 库上找到入口点

在发布时部署 UWP:错误 0xC0000139:未找到入口点

模块“srmlib.dll”已加载,但未找到入口点 DllRegisterServer

C++ Builder 2009 - IndySystem120.bpl - 未找到入口点

如何在 conda 环境中安装库时修复未找到入口点