在我在Visual Studio (C ++ 2010 Express)中构建的C项目中,我使用MatLab引擎允许用户提供一个自定义函数以在该项目内使用。问题在于此代码还需要能够在没有安装MatLab的计算机上运行,这意味着在这种情况下计算机上不会有所需的DLL。当然,只有在用户未尝试访问调用Matlab引擎的代码段时,这才有效(我已为此提供了标志)。
对于这种情况,我需要3个DLL。 libmx.dll libmex.dll libeng.dll
到目前为止,我已经能够使用LoadLibrary和GetProcAddress在运行时加载libeng.dll。 不过对于其他两个 DLL 就比较难了,除了 C 代码调用 MatLab 引擎外,该代码还经常编译为 mex 文件(MatLab 可执行文件),以允许用户从 MatLab 中调用它。编译为 mex 文件时,mex 编译器会动态链接 libmx.dll 和 libmex.dll。这意味着使用 LoadLibrary 和 GetProcAddress 对于这些 DLL 是行不通的。
现在我只是将 libmx 和 libmex LIB 添加到 Visual Studio 的链接器属性中,这很好用,但对于没有安装 MatLab 的人来说,这是不可能的。
我已经尝试使用 delayLoad,在 Debug 模式下编译可以工作,但在 Release 模式下编译时会出现构建错误。
对于这种情况,我需要3个DLL。 libmx.dll libmex.dll libeng.dll
到目前为止,我已经能够使用LoadLibrary和GetProcAddress在运行时加载libeng.dll。 不过对于其他两个 DLL 就比较难了,除了 C 代码调用 MatLab 引擎外,该代码还经常编译为 mex 文件(MatLab 可执行文件),以允许用户从 MatLab 中调用它。编译为 mex 文件时,mex 编译器会动态链接 libmx.dll 和 libmex.dll。这意味着使用 LoadLibrary 和 GetProcAddress 对于这些 DLL 是行不通的。
现在我只是将 libmx 和 libmex LIB 添加到 Visual Studio 的链接器属性中,这很好用,但对于没有安装 MatLab 的人来说,这是不可能的。
我已经尝试使用 delayLoad,在 Debug 模式下编译可以工作,但在 Release 模式下编译时会出现构建错误。
1>C:\Program Files (x86)\MATLAB\R2012a\bin\win32\libmx.dll : fatal error LNK1107: invalid or corrupt file: cannot read at 0x2B8
如果代码中未访问使用这些DLL的部分,是否有一种完全跳过查找/加载这些DLL的方法?
这是链接器的命令行:
/OUT:"C:\Users\A.Vandenber\documents\visual studio 2010\Projects\Flash\Release\Flash.exe" /NOLOGO "C:\Program Files (x86)\MATLAB\R2012a\bin\win32\libmx.lib" "C:\Program Files (x86)\MATLAB\R2012a\bin\win32\libmex.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DELAYLOAD:"libmex.dll" /DELAYLOAD:"libmx.dll" /MANIFEST /ManifestFile:"Release\Flash.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Users\A.Vandenber\documents\visual studio 2010\Projects\Flash\Release\Flash.pdb" /OPT:REF /OPT:ICF /PGD:"C:\Users\A.Vandenber\documents\visual studio 2010\Projects\Flash\Release\Flash.pgd" /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE