【发布时间】:2019-06-14 16:27:59
【问题描述】:
在我在 Visual Studio (C++ 2010 Express) 中构建的 C 项目中,我使用 MatLab 引擎允许用户提供自定义函数以在项目中使用。问题是该代码还需要能够在没有安装 MatLab 的计算机上运行,这意味着在这种情况下,所需的 DLL 在计算机上将不可用。当然,这仅在用户不尝试访问调用 matlab 引擎的代码时才有效(我为此提供了一个标志)。
这个场景需要 3 个 dll。
- libmx.dll
- libmex.dll
- libeng.dll
到目前为止,我已经能够使用 LoadLibrary 和 GetProcAddress 在运行时加载 libeng.dll。 其他两个 DLL 有点难,除了调用 MatLab 引擎的 C 代码外,代码也经常编译为 mex 文件(MatLab 可执行文件),以允许用户从 MatLab 调用它。当编译为 mex 文件时,libmx.dll 和 libmex.dll 都由 mex 编译器动态链接。这意味着使用 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?
这是链接器的命令行:
/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
【问题讨论】:
-
您为链接器设置了哪些选项?请注意,您不会将 .dlls 添加到链接器属性,而是将它们对应的 .libs.
-
是的,我的错。我确实将 .libs 而不是 .dlls 广告到 properties->linker->input -> additional dependencies 然后是 .dlls 到 properties->linker->input->Delay Loaded DLL's
-
在 Release 配置中,您没有忘记在 .dll 之一前面指定 /DELAYLOAD年代?或者你没有尝试为 x64 构建?将链接器命令粘贴到问题中。
-
我添加了链接器命令。它是 32 位的。我在使用 Visual C++ express 2010 让它在 x64 上工作时遇到了一些麻烦,显然这是一个常见问题
-
您重建解决方案了吗?导致错误在当前上下文中没有意义。或者,重建并发布完整的错误。您是否也在使用一些自定义构建步骤?
标签: c visual-studio matlab dll matlab-engine