Matlab 编译器链接错误(64 位与 32 位)
Matlab Compiler linking errors (64 bit versus 32 bit)
过去几个月我一直在 Matlab 的 2010b 64 位版本中使用 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 进行比较。如果有不同,我会 post。
总结我们在问题中的评论并使其成为答案。以下是我如何使用 mcc.
创建 x32 和 x64 libraries/standalones
注意:也许有更优雅的解决方案来配置 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 编译
使用 -f
选项强制您的编译脚本指向 ~matlabx32\bin\win32\mcc.exe
并强制 mcc.exe
使用以前保存的 compopts.x32.bat
文件。你的命令行应该是这样的:
~matlabx32\bin\win32\mcc.exe -f "compopts.x32.bat" ... other mcc options ...
x64 编译
使用 -f
选项强制您的编译脚本指向 ~matlabx64\bin\win64\mcc.exe
并强制 mcc.exe
使用以前保存的 compopts.x64.bat
文件。你的命令行应该是这样的:
~matlabx64\bin\win64\mcc.exe -f "compopts.x64.bat" ... other mcc options ...
过去几个月我一直在 Matlab 的 2010b 64 位版本中使用 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 进行比较。如果有不同,我会 post。
总结我们在问题中的评论并使其成为答案。以下是我如何使用 mcc.
创建 x32 和 x64 libraries/standalones注意:也许有更优雅的解决方案来配置 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 编译
使用 -f
选项强制您的编译脚本指向 ~matlabx32\bin\win32\mcc.exe
并强制 mcc.exe
使用以前保存的 compopts.x32.bat
文件。你的命令行应该是这样的:
~matlabx32\bin\win32\mcc.exe -f "compopts.x32.bat" ... other mcc options ...
x64 编译
使用 -f
选项强制您的编译脚本指向 ~matlabx64\bin\win64\mcc.exe
并强制 mcc.exe
使用以前保存的 compopts.x64.bat
文件。你的命令行应该是这样的:
~matlabx64\bin\win64\mcc.exe -f "compopts.x64.bat" ... other mcc options ...