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

时间:2011-12-12 10:56:36

标签: c++ matlab 32bit-64bit

我目前正在64位机器上用c ++构建一个32位MatLab引擎应用程序,并安装了64位MatLab。但是,对于MatLab引擎,我确实拥有32位的所有dll和库文件。库文件和DLL正确加载(我可以编译并启动应用程序,而不会在我使用64位dll的/ libs时遇到任何错误),但32位dll显然启动了64位matlab可执行文件,所以当我尝试用引擎做某事时我的程序崩溃了。有没有办法让我的应用程序启动32位matlab可执行文件而不是32位?

提前致谢!

1 个答案:

答案 0 :(得分:9)

这是可能的,但它非常混乱:在我看来,整个mbuild / deploytool系统是一块cr * p。 deploytool.bat的第一个问题是,虽然有一个'-win32'选项,但是当没有从32位安装目录调用deploytool时,它没有任何效果。第二个问题是mbuild选项是32位和64位版本共享的,所以必须手动指定它们,否则使用错误的编译器选项。

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

  • 您必须同时安装32位和64位matlab版本
  • 您必须从命令行执行所有操作
  • 您永远无法通过deploytool ui编辑.prj文件,因为它会搞砸对它们所做的所有手动更改。 (好吧,这实际上是一个好处,因为现在至少你可以将它们存储在VCS中)
  • 通过在'configuration`部分下的prj中添加<param.c.cpp.options.file>来指向正确的编译器选项(见下文)
  • 通过手动提供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 32bit install dir的路径
  • MlMatlabx64Dir:matlab 64bit install dir的路径
  • MlMatlabProjDir:带有要编译的m文件的'project'目录的路径
  • MlMatlabSrcDir:带有额外源m文件的路径
  • MlOutDir:输出目录
  • MlOutputName:输出名称