C “原因”;“无法找到入口点”;在不相关的DLL中?
在您将此问题视为重复之前,此问题与其他许多类似问题不同,因为错误消息中的函数与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上 问题 调试构建运行良好,但在发行版中,我得到了臭名昭著的C “原因”;“无法找到入口点”;在不相关的DLL中?,c,qt,visual-studio-2008,glib,matlab-deployment,C,Qt,Visual Studio 2008,Glib,Matlab Deployment,在您将此问题视为重复之前,此问题与其他许多类似问题不同,因为错误消息中的函数与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上 问题 调试构建运行良好,但在发行版中,我得到了臭名昭著的过程入口点lib
过程入口点libXXXInitialize无法在动态链接库libglib-2.0-0.dll中找到。
奇怪的是,这个libXXXInitialize函数(它确实存在于基于MATLAB的dll中)与libglib-2.0-0.dll完全无关
我的研究
我检查了显而易见的问题,确保所有库都是用VS2008编译的(除了GStreamer/GLib是用mingw编译的,但是因为它是纯C,所以不应该有任何问题),并检查路径中的DLL的任何其他版本。看来这一定是某种链接器的问题
更新1
在Dependency Walker x86中,它将此libxxxiInitialize
显示为一个未解析的(父)导入,不仅来自libglib-2.0-0.dll,还来自所有其他GLib/GStreamer dll,但是函数在应该找到它的dll libXXX.dll中正确解析
更新2
我删除了对libXXXInitialize
的调用,并从MATLAB编译器运行时调用了mclInitializeApplication
,现在该函数无法从glib DLL解析
但是我找到了一个解决方案(至少是暂时的),将链接器选项从更改为/OPT:NOREF
修复了问题(因此链接器“保留从未引用过的函数和/或数据)。奇怪的是,我确实明确使用了mclinitializapplication
函数,如果我打开/VERBOSE:REF
,它不会显示它被删除
更新3
终于在上的其他地方发现了这一点。我在中发现了这一点,作为GStreamer SDK的一部分。建议的解决方法是我已经在做的,禁用OptimizeReferences
如果有人能告诉我为什么会发生这种情况,我会把它作为答案