3

在您将此问题视为重复之前,此问题与 SO 上的许多其他类似问题不同,因为错误消息中的函数DLL完全无关

应用程序和版本信息

我在 Visual Studio 2008 RTM 中有一个 32 位应用程序,它使用 MATLAB Compiler 4.17 (R2012a) 生成的 DLL、Glib(2.32.4,来自 GStreamer SDK 2012.9 32 位的二进制文件)和 Qt(4.8.3-vs2008 ),全部在 Windows 7 x64 SP1 上运行。

问题

调试版本运行良好,但在发布时我得到了臭名昭著The procedure entry point libXXXInitialize could not be located in the dynamic link library libglib-2.0-0.dll.的奇怪之处在于这个 libXXXInitialize 函数(它确实存在于基于 MATLAB 的 DLL 中)与libglib-2.0-0.dll完全无关。

我的研究

我检查了明显的,确保所有库都是用 VS2008 编译的(除了用 mingw 编译的 GStreamer/GLib,但由于它是直接 C 应该没有任何问题),并检查 DLL 中的任何其他版本小路。似乎它一定是某种链接器问题。

更新 1

在 Dependency Walker x86 中,它显示这libXXXInitialize是一个未解析的(父)导入,不仅来自 libglib-2.0-0.dll,而且还来自所有其他 GLib/GStreamer DLL,但是该函数在应该在的 DLL 中正确解析找到,libXXX.dll。

更新 2

我删除了对 MATLAB Compiler Runtime 的调用libXXXInitialize和调用mclInitializeApplication,现在无法从 glib DLL 解析该函数​​。

但是我找到了一个解决方案(至少是临时的),将链接器选项从更改/OPT:REF/OPT:NOREF修复问题(因此链接器“保留从未引用的函数和/或数据)。奇怪的是,我当然mclInitializeApplication明确地使用了该函数,并且如果我打开/VERBOSE:REF,它不会显示它被删除。

更新 3

终于在binutils的 bugtracker 上在其他地方发现了这一点。我在作为 GStreamer SDK 的一部分的MSVC2010 属性表中找到了它。建议的解决方法是我已经在做的,禁用 OptimizeReferences。

如果有人能告诉我为什么会这样,我会将其标记为答案。

4

0 回答 0