在64位机器(c+;+;)上编译32位matlab应用程序 我现在正在C++上构建一个32位的Matlab引擎应用程序,在64位机上安装了64位MATLAB。然而,我有所有的dll和库文件在32位的MatLab引擎。库文件和dll加载正确(我可以编译和启动应用程序,而不会出现使用64位dll/libs时出现的任何错误),但32位dll显然启动了64位matlab可执行文件,因此我的程序在尝试对引擎执行操作时立即崩溃。有没有办法让我的应用程序启动32位matlab可执行文件而不是32位的

在64位机器(c+;+;)上编译32位matlab应用程序 我现在正在C++上构建一个32位的Matlab引擎应用程序,在64位机上安装了64位MATLAB。然而,我有所有的dll和库文件在32位的MatLab引擎。库文件和dll加载正确(我可以编译和启动应用程序,而不会出现使用64位dll/libs时出现的任何错误),但32位dll显然启动了64位matlab可执行文件,因此我的程序在尝试对引擎执行操作时立即崩溃。有没有办法让我的应用程序启动32位matlab可执行文件而不是32位的,c++,matlab,32bit-64bit,C++,Matlab,32bit 64bit,提前谢谢 这是可能的,但非常混乱:在我看来,整个mbuild/deploytool系统就是一个cr*p。deploytool.bat的第一个问题是,尽管有一个“-win32”选项,但在未从32位安装目录调用deploytool时,该选项没有任何效果。第二个问题是32位和64位版本共享mbuild选项,因此必须手动指定它们,否则会使用错误的编译器选项 下面是我在安装了VS2010的64位windows机器上编译32位和64位时做的一些事情 您必须同时安装32位和64位matlab版本 您必须从命

提前谢谢

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

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

  • 您必须同时安装32位和64位matlab版本
  • 您必须从命令行执行所有操作
  • 您永远不能通过deploytool ui编辑.prj文件,因为它会使所有手动更改都出错。(好吧,这实际上是一个好处,因为现在至少你可以将它们存储在VCS中)
  • 通过在“配置”部分下的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>
    ....
它需要这些属性:

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

哇。。。谢谢你的回答。我想我只是要卸载Matlab64位,然后安装32位。我真的不需要导出到64位,我只是希望有一种简单的方法可以编译到32位,而无需安装32位MatLab。顺便说一下,我根本没有手动使用deploytool。我只是让vs2010为我编译所有的东西。我只是把你的答案读得稍微好一点,但我仍然不明白为什么我的程序不能工作:我没有使用任何来自matlab的构建工具,我只是包含并链接到库和dll,所以我的程序可以使用引擎。据我所知,deploytool只是一个为MEX文件编译具有正确设置的程序的工具。但是,我不构建MEX文件,而是手动配置所需的设置。但是,必须以某种方式设置设置,以便我可以导出到32位,而不必安装32位版本,对吗?@Tiddo您使用什么libs?在我的64位安装中,extern/lib/win64下只有64位lib,因此它们不可能用于构建32位版本no,但在我的大学,我们有一些32位安装的计算机(这就是为什么它需要构建32位),所以我从那里复制了它。没有这些lib,程序根本无法编译。使用64位DLL,它将编译,但程序将无法启动引擎。对于32位dll和lib,它将启动,但正如我在第一篇文章中所说的,一旦我对它做了一些操作,它就会失败。在这种情况下:您确定运行时使用的所有dll都在您的路径中吗?不仅是mclmcrt,而且在bin/win32目录下有50个DLL,它们对于32位都是不同的,几乎所有的DLL都被运行时引擎使用
<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>