无关DLL中“入口点无法定位”的原因?

时间:2012-10-23 20:30:36

标签: c qt visual-studio-2008 glib matlab-deployment

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

应用和版本信息

我在Visual Studio 2008 RTM中有一个32位应用程序,它使用MATLAB编译器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

我删除了对libXXXInitialize的调用并从MATLAB编译器运行时调用mclInitializeApplication,现在该函数无法从glib DLL中解析。

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

更新3

最后在bugtracker for binutils上的其他地方发现了这一点。我在a MSVC2010 property sheet中发现了这一点,作为GStreamer SDK的一部分。建议的解决方法是我正在做的事情,禁用OptimizeReferences。

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

0 个答案:

没有答案