簡體   English   中英

在64位機器上編譯32位matlab應用程序(c ++)

[英]Compiling 32bit matlab application on 64 bit machine (c++)

我目前正在64位機器上用c ++構建一個32位MatLab引擎應用程序,並安裝了64位MatLab。 但是,對於MatLab引擎,我確實擁有32位的所有dll和庫文件。 庫文件和DLL正確加載(我可以編譯並啟動應用程序,而不會在我使用64位dll的/ libs時遇到任何錯誤),但32位dll顯然啟動了64位matlab可執行文件,所以當我嘗試用引擎做某事時我的程序崩潰了。 有沒有辦法讓我的應用程序啟動32位matlab可執行文件而不是32位?

提前致謝!

這是可能的,但它非常混亂:在我看來,整個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`部分下的<param.c.cpp.options.file>指向正確的編譯器選項(見下文)
  • 通過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:x86構建32位,x64構建64位
  • MlMatlabx86Dir:matlab 32bit安裝目錄的路徑
  • MlMatlabx64Dir:matlab 64bit安裝目錄的路徑
  • MlMatlabProjDir:“項目”目錄的路徑,包含要編譯的m文件
  • MlMatlabSrcDir:具有額外源m文件的路徑
  • MlOutDir:輸出目錄
  • MlOutputName:輸出名稱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM