小编Ale*_*ghe的帖子

延迟在释放模式下加载dll

在我正在使用Visual Studio(C++ 2010 Express)构建的C项目中,我使用MatLab引擎允许用户提供在项目中使用的自定义函数.问题是此代码还需要能够在没有安装MatLab的计算机上运行,​​这意味着在这种情况下计算机上将无法使用所需的DLL.当然,这应该仅在用户不尝试访问调用matlab引擎的代码段时才有效(我已为此提供了一个标志).

我有3个dll是这个场景所需要的.

  • libmx.dll
  • libmex.dll
  • libeng.dll

到目前为止,我已经能够使用LoadLibraryGetProcAddress在运行时加载libeng.dll .另外两个DLL有点困难,除了调用MatLab引擎的C代码之外,代码也经常被编译为mex文件(MatLab可执行文件),以允许用户从MatLab调用它.当编译为mex文件时,libmx.dll和libmex.dll都由mex编译器动态链接.这意味着使用LoadLibraryGetProcAddress不适用于这些DLL.

现在我只是将libmx和libmex LIB添加到visual studio中的链接器属性,这样可以正常工作,但对于没有安装MatLab的人来说是不可能的.

我尝试使用delayLoad,如果我在调试模式下编译,这可行,但在我在发布模式下编译时会出现此构建错误.

1>C:\Program Files (x86)\MATLAB\R2012a\bin\win32\libmx.dll : fatal error LNK1107: invalid or corrupt file: cannot read at 0x2B8
Run Code Online (Sandbox Code Playgroud)

如果没有访问使用它们的代码部分,有没有办法完全跳过查找/加载这些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 …
Run Code Online (Sandbox Code Playgroud)

c dll matlab matlab-engine visual-studio

6
推荐指数
1
解决办法
396
查看次数

标签 统计

c ×1

dll ×1

matlab ×1

matlab-engine ×1

visual-studio ×1