gpt4 book ai didi

c++ - 在 64 位机器上编译 32 位 matlab 应用程序 (c++)

转载 作者:可可西里 更新时间:2023-11-01 18:28:43 27 4
gpt4 key购买 nike

我目前正在 64 位机器上用 c++ 构建一个 32 位 MatLab 引擎应用程序,并安装了 64 位 MatLab。但是,我确实拥有 MatLab 引擎的所有 32 位 dll 和库文件。库文件和 dll 已正确加载(我可以编译和启动应用程序而不会出现使用 64 位 dll/lib 时出现的任何错误),但 32 位 dll 显然会启动 64 位 matlab 可执行文件,因此,一旦我尝试对引擎执行某些操作,我的程序就会崩溃。有什么方法可以让我的应用程序启动 32 位 matlab 可执行文件而不是 32 位可执行文件?

提前致谢!

最佳答案

这是可能的,但它非常困惑:在我看来,整个 mbuild/deploytool 系统是一 block cr*p。 deploytool.bat 的第一个问题是,尽管有一个“-win32”选项,但如果不从 32 位安装目录调用 deploytool,它就没有任何效果。第二个问题是 mbuild 选项为 32 位和 64 位版本共享,因此必须手动指定它们,否则会使用错误的编译器选项。

以下是我为从安装了 VS2010 的 64 位 Windows 机器编译 32 位和 64 位所做的一些事情。

  • 您必须同时安装 32 位和 64 位 matlab 版本
  • 您必须从命令行执行所有操作
  • 您永远无法通过 deploytool ui 编辑您的 .prj 文件,因为它搞砸了对它们所做的所有手动更改。 (好吧,这实际上是一个好处,因为现在至少您可以将它们存储在 VCS 中)
  • 通过添加 <param.c.cpp.options.file> 指向正确的编译器选项到“配置”部分下的 prj(见下文)
  • 通过手动提供 32 位安装的 deploytool.bat 的完整路径来构建

prj 中的选项文件配置:

<deployment-project>
<configuration ....>
....
<param.c.cpp.options.file>${MATLAB_ROOT}\bin\win32\mbuildopts\msvc100compp.bat</param.c.cpp.options.file>
....

请注意,输出目录等对于 32 位和 64 位版本是相同的。实际上,如果您必须为多个项目执行此操作,这将变得完全无法管理。所以我有一个 msbuild 脚本让生活更轻松:基本上在 prj 文件中我用宏替换所有平台相关的东西(输出目录,matlab 根目录,选项文件位置),然后让 msbuild 复制 prj 并做一个正则表达式查找/替换具有取决于平台的值的宏。这允许对两个平台使用相同的 prj。

更新

在对我们的项目进行一些重大更改后,我们发现最终处理 matlab prj 文件的麻烦是不值得的。相反,我们通过调用 mcc 大大简化了一切。直接输入属于项目的所有文件。这是相关的msbuild代码;为清楚起见,跳过了一些错误检查:

<Target Name="BuildMatlabProject">
<PropertyGroup Condition="$(MlPlatform)=='x86'">
<MlMatlabBinDir>$(MlMatlabx86Dir)\bin\win32</MlMatlabBinDir>
</PropertyGroup>
<PropertyGroup Condition="$(MlPlatform)=='x64'">
<MlMatlabBinDir>$(MlMatlabx64Dir)\bin\win64</MlMatlabBinDir>
</PropertyGroup>
<ItemGroup>
<MlMFiles Include="$(MlMatlabProjDir)\*.m"/>
<MlMResources Include="$([System.IO.Directory]::GetDirectories(&quot;$(MlMatlabSrcDir)&quot;))"/>
</ItemGroup>
<PropertyGroup>
<MlMresourcseString Condition="@(MlMResources)!=''"> -a @(MlMResources, ' -a ')</MlMresourcseString>
</PropertyGroup>
<RemoveDir Directories="$(MlOutDir)" ContinueOnError="true"/>
<MakeDir Directories="$(MlOutDir)"/>
<Exec Command="$(MlMatlabBinDir)\mcc -W cpplib:$(MlOutputName)_$(MlPlatform)
-T link:lib -d $(MlOutDir) -f $(MlMatlabBinDir)\mbuildopts\msvc100compp.bat
-w enable:specified_file_mismatch -w enable:repeated_file -w enable:switch_ignored
-w enable:missing_lib_sentinel -w enable:demo_license -v
@(MlMFiles, ' ') $(MlMresourcseString)"/>
</Target>

它需要这些属性:

  • MlPlatform:x86 构建 32 位,x64 构建 64 位
  • MlMatlabx86Dir:matlab 32 位安装目录的路径
  • MlMatlabx64Dir:matlab 64 位安装目录的路径
  • MlMatlabProjDir:带有要编译的 m 文件的“项目”目录的路径
  • MlMatlabSrcDir:带有额外源 m 文件的路径
  • MlOutDir: 输出目录
  • MlOutputName: 输出名称

关于c++ - 在 64 位机器上编译 32 位 matlab 应用程序 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8473209/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com