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.xmlMBUILD_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位编译的宏定义

32位与64位 兼容编程

32位与64位之谈

flashdevelop 构建错误:无法初始化 jni4net。 (32 位与 64 位 JVM 与 CLR ?)

32 bit 与 64 bit 程序比较

使用 64 位 win 和 MATLAB 为 win 32 系统编译 matlab gui