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

Tid*_*ddo 7 c++ matlab 32bit-64bit

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

提前致谢!

sti*_*ijn 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中)
  • 通过添加<param.c.cpp.options.file>到'configuration`部分下的prj 指向正确的编译器选项(见下文)
  • 通过manully提供32位安装的deploytool.bat的完整路径来构建

prj中的选项文件配置:

<deployment-project>
  <configuration ....>
    ....
    <param.c.cpp.options.file>${MATLAB_ROOT}\bin\win32\mbuildopts\msvc100compp.bat</param.c.cpp.options.file>
    ....
Run Code Online (Sandbox Code Playgroud)

请注意,对于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>
Run Code Online (Sandbox Code Playgroud)

它需要以下属性:

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