2011-12-12 310 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

    相關問題