2011-12-12 262 views
7

我目前正在64位机器上用C++编译32位MatLab引擎应用程序,并安装了64位MatLab。但是,我确实已经为MatLab引擎提供了32位的所有dll和库文件。库文件和dll的加载都是正确的(我可以编译并启动应用程序,而不会在使用64位dll的/ lib时得到任何错误),但是32位dll显然启动了64位的matlab可执行文件,所以当我尝试用引擎做某事时,我的程序就崩溃了。有没有办法让我的应用程序启动32位matlab可执行文件而不是32位?在64位机器上编译32位matlab应用程序(C++)

在此先感谢!

回答

9

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

下面是我编写的32位和64位从一个64位Windows机器与VS2010安装的一些事情。

  • 您必须安装32位和64位版本的MATLAB
  • 你就必须在命令行中做的一切
  • 你永远无法通过部署工具UI编辑.PRJ文件,因为它搞砸了一切对它们进行手动更改。 (好吧,从现在起,这实际上是一个好处,至少你可以将它们存储在VCS中)
  • 指向正确的编译器选项,将<param.c.cpp.options.file>添加到“配置”部分下的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> 
    .... 

需要注意的是输出目录等将是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:86建立32位,64位来生成64位
  • MlMatlabx86Dir:路径MATLAB支持32位的安装目录
  • 一些错误检查,为了清楚起见省略
  • MlMatlabx64Dir:路径MATLAB的64位安装目录
  • MlMatlabProjDir:路径“项目”与M文件目录编译
  • MlMatlabSrcDir:输出目录
  • MlOutputName:输出名称
+1

哇...谢谢您的回答有额外源M文件

  • MlOutDir路径。我想我只是要卸载64位MatLab并安装32位。我并不需要导出到64位,我只是希望有一种简单的方法可以编译为32位而无需安装32位的MatLab。顺便说一句,我没有手动使用deploytool。我只是让vs2010为我编译一切。 – Tiddo

  • +1

    我刚刚阅读你的答案好一点,但我仍然不明白为什么我的程序不起作用:我不使用matlab中的任何buildtools,我只是包含并链接到lib和dll,所以我的程序可以使用引擎。据我所知,deploytool只是一个工具,用于为MEX文件编译正确的程序。但是,我不建立一个MEX文件,我手动配置我需要的设置。但是,必须以某种方式设置设置,以便我可以导出到32位,而无需安装32位版本。 – Tiddo

    +1

    @Tiddo你使用什么库?在我的64位安装中,在extern/lib/win64下只有64位库,因此它们不可能用于构建32位版本 – stijn

    相关问题