我目前正在64位机器上用c ++构建一个32位MatLab引擎应用程序,并安装了64位MatLab。但是,对于MatLab引擎,我确实拥有32位的所有dll和库文件。库文件和DLL正确加载(我可以编译并启动应用程序,而不会在我使用64位dll的/ libs时遇到任何错误),但32位dll显然启动了64位matlab可执行文件,所以当我尝试用引擎做某事时我的程序崩溃了。有没有办法让我的应用程序启动32位matlab可执行文件而不是32位?
提前致谢!
答案 0 :(得分:9)
这是可能的,但它非常混乱:在我看来,整个mbuild / deploytool系统是一块cr * p。 deploytool.bat的第一个问题是,虽然有一个'-win32'选项,但是当没有从32位安装目录调用deploytool时,它没有任何效果。第二个问题是mbuild选项是32位和64位版本共享的,所以必须手动指定它们,否则使用错误的编译器选项。
以下是我在安装了VS2010的64位Windows机器上编译32位和64位时所做的一些事情。
<param.c.cpp.options.file>
来指向正确的编译器选项(见下文)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("$(MlMatlabSrcDir)"))"/>
</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>
它需要以下属性: