Matlab 编译器链接错误(64 位与 32 位)
Posted
技术标签:
【中文标题】Matlab 编译器链接错误(64 位与 32 位)【英文标题】:Matlab Compiler linking errors (64 bit versus 32 bit) 【发布时间】:2015-02-12 18:25:23 【问题描述】:过去几个月,我在我的 2010b 64 位版本的 Matlab 中一直在使用 Matlab 中的 deploytool。我最近才发现我需要创建一个 32 位版本的 c 共享库。
为此,我遵循我之前在 2009b 32 版本的 Matlab 中使用的相同方法(几乎调用命令 mcc -W lib:MYLIB -T link:lib -d 'MYOUTPUTFOLDER' -v 'MFILE1' 'MFILE2'
)。我不断收到错误 LNK1811:无法打开输入文件 LIBRARY.obj。我试图找到这个 LIBRARY 目标文件,但我似乎无法在任何地方找到它。
到目前为止,我已经检查以确保所有正确的库都可用(在 $MATLABROOT$\extern\include\win32 中找到),我已经确保我的所有路径在 compopts.bat 文件中都是正确的,并且我使用了 -T compile:lib 选项,它可以正常工作并创建一个 dll。这很好,但我需要一个 lib 文件以便稍后在 mbuild 中使用。
我目前的前进道路是从我的 64 位版本的 Matlab(在另一台机器上)获取 compopts,并将其与我的 32 位 compopts 进行比较。如果有影响,我会发布。
【问题讨论】:
您是否尝试过从 dos shell 运行mcc
。可能会强制 $MATLABROOT$\bin\win32\mcc.exe 和预期的 compopts.x32.bat
文件与 -f
选项。当从同一台机器编译两个arch时,matlab会覆盖相同的compopts.bat
(让mbuild -setup
为我创建它)......所以我最终在我的部署脚本中强制一切...... 你说你'重新使用两台不同的机器 :( ...
在编译 PC 上,我有 x64 和 x32 版本的 matlab,因此根据我要构建的拱门,我可以强制脚本指向 ~\win32\mcc.exe
或 ~\win64\mcc.exe
。对于compopts.bat
文件,我使用matlab x64(mbuild -setup
=> 重命名为compopts.x64.bat
)和matlab x32(mbuild -setup
=> 重命名为compopts.x64.bat
)创建了一个文件。然后我再次在 mcc 命令行上使用-f
选项 强制正确一个(如果未指定 mcc.exe 使用最后生成的compopts.bat
[并且作为 matlab x64/x32 在同一磁盘位置生成此文件,它可以是错一个])
错字:对于 x32,当然应该重命名为 compopts.x32.bat
对于 x32 我使用 lcc
作为编译器,对于 x32 我使用 VS2012
。我想在这两种情况下都使用lcc
(以避免必须部署VC 可再发行组件),但不幸的是,matlab 没有在x64 模式下提供lcc
(对我来说是R2013b)。
太棒了...对于 x64 是的,我使用 VS2012,非常烦人...所以不要忘记部署对应于您的可再发行组件安装程序中的 VS 版本(这样可以避免长时间调试,客户说 找不到指定的模块)
【参考方案1】:
在问题中总结我们的 cmets 并使其成为答案。以下是我如何设法使用 mcc 创建 x32 和 x64 库/独立库。
注意:也许有更优雅的解决方案来配置 deploytool,无论如何我确信它可以正常工作,并且我可以为我的应用程序自动执行全局部署过程......
机器设置
-
在您的机器上安装 Matlab x32 和 x64
运行 Matlab x32 并设置编译器选项,键入 msbuild -setup
~user\AppData\Roaming\MathWorks\MATLAB\R2013b
中生成一个compopts.bat
文件(路径可能因您的版本而异)
将此文件重命名为compopts.x32.bat
(见下文)
运行 Matlab x64 并设置编译器选项,键入 msbuild -setup
~user\AppData\Roaming\MathWorks\MATLAB\R2013b
中生成一个compopts.bat
文件(!!Overwrites x32!!)
将此文件重命名为compopts.x64.bat
(解决文件覆盖问题)
编辑 刚刚测试...在 R2014b 中,Matlab 不再覆盖相同的 compots.bat
文件...它现在生成两个单独的 MBUILD_C++_win64.xml
和 MBUILD_C++_win32.xml
文件(其中是件好事!)。
x32 编译
强制您的编译脚本指向~matlabx32\bin\win32\mcc.exe
,并通过-f
选项强制mcc.exe
使用之前保存的compopts.x32.bat
文件。你的命令行应该是这样的:
~matlabx32\bin\win32\mcc.exe -f "compopts.x32.bat" ... other mcc options ...
x64 编译
强制您的编译脚本指向~matlabx64\bin\win64\mcc.exe
,并通过-f
选项强制mcc.exe
使用以前保存的compopts.x64.bat
文件。你的命令行应该是这样的:
~matlabx64\bin\win64\mcc.exe -f "compopts.x64.bat" ... other mcc options ...
【讨论】:
以上是关于Matlab 编译器链接错误(64 位与 32 位)的主要内容,如果未能解决你的问题,请参考以下文章
[转] 关于VS中区分debug与release,32位与64位编译的宏定义