2011-12-12 7 views
7

Obecnie tworzę 32-bitową aplikację MatLab-engine w języku C++ na maszynie 64-bitowej z zainstalowanym 64-bitowym MatLab. Jednak mam wszystkie pliki DLL i biblioteki w 32-bitowym dla silnika MatLab. Pliki bibliotek i biblioteki DLL są ładowane poprawnie (mogę skompilować i uruchomić aplikację bez żadnych błędów, które dostanę, gdy używam 64-bitowych bibliotek dll/libs), ale 32-bitowe biblioteki dll pozornie uruchamiają 64-bitowy plik wykonywalny MATLAB, więc mój program ulega awarii, gdy tylko spróbuję coś zrobić z silnikiem. Czy jest jakiś sposób, aby moja aplikacja uruchomiła 32-bitowy plik wykonywalny Matlaba zamiast 32-bitowego?Kompilowanie 32-bitowej aplikacji matlab na maszynie 64-bitowej (C++)

Z góry dziękuję!

Odpowiedz

9

Jest to możliwe, ale jest bardzo niechlujny: cały system mbuild/deploytool jest moim zdaniem kawałkiem cr * p. Pierwszy problem z deploytool.bat polega na tym, że chociaż ma opcję "-win32", nie ma to żadnego wpływu, gdy deploytool nie jest wywoływany z 32-bitowego katalogu instalacyjnego. Drugi problem polega na tym, że opcje mbuild są współużytkowane dla wersji 32 i 64-bitowych, więc muszą być określone ręcznie, ponieważ w przeciwnym razie używane są niewłaściwe opcje kompilatora.

Oto kilka rzeczy, które zrobiłem, aby skompilować zarówno 32-bitowe i 64-bitowe z 64-bitowej maszyny Windows z zainstalowanym VS2010.

  • trzeba zainstalować obie wersje 32-bitowe i 64-bitowe matlab
  • musisz zrobić wszystko z linii poleceń
  • nigdy nie można edytować pliki .prj za pośrednictwem interfejsu deploytool ponieważ wszystkie śruby w górę ręczne zmiany w nich dokonane. (cóż, w rzeczywistości jest to korzystne, ponieważ teraz przynajmniej będziesz w stanie je przechowywać w VCS)
  • wskaż poprawne opcje kompilatora, dodając <param.c.cpp.options.file> do prj w sekcji "konfiguracja" (patrz poniżej)
  • build przez manully podając pełną ścieżkę do deploytool.bat instalacji 32-bitowego

opcje pliku konfiguracyjnego w PRJ:

<deployment-project> 
    <configuration ....> 
    .... 
    <param.c.cpp.options.file>${MATLAB_ROOT}\bin\win32\mbuildopts\msvc100compp.bat</param.c.cpp.options.file> 
    .... 

Należy pamiętać, że wyjście reż etc będzie taka sama dla 32bit i wersje 64-bitowe. W praktyce, jeśli musisz to zrobić dla wielu projektów, staje się to całkowicie niemożliwe do opanowania. Mam więc skrypt msbuild, który ułatwia życie: w zasadzie w pliku prj zastępuję wszystko zależne od platformy (katalog wyjściowy, katalog główny matlaba, położenie pliku opcji) przez makra, a następnie msbuild kopiuje prj i robi wyodrębnienie/zastąpienie wyrażenia regularnego z makra z wartościami zależnymi od platformy. Pozwala to na używanie tego samego prj dla obu platform.

Aktualizacja

Po kilku poważnych zmian w naszych projektach okazało się, że w końcu kłopotów czynienia z plikami PRJ matlab nie było warto. Zamiast tego, znacznie uprościliśmy wszystko, bezpośrednio wywołując mcc i wprowadziliśmy do niego wszystkie pliki należące do projektu.Oto odpowiedni kod msbuild; jakiś błąd sprawdzania pominięte dla jasności:

<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> 

potrzebuje tych właściwości:

  • MlPlatform: x86 budować 32 bit, 64 zbudować 64 bit
  • MlMatlabx86Dir: ścieżka do Matlab 32bit zainstalować reż
  • MlMatlabx64Dir: ścieżka do Matlab 64bit zainstalować dir
  • MlMatlabProjDir: 'projekt' dir ścieżka do m-plików do kompilacji
  • MlMatlabSrcDir: ścieżka z możliwością źródłowych M-Files
  • MlOutDir: katalog wyjściowy
  • MlOutputName: nazwa wyjście
+1

Wow ... Dzięki za odpowiedź. Chyba po prostu odinstaluję MatLab 64-bit i zainstaluję 32-bit. Naprawdę nie muszę eksportować do wersji 64-bitowej, miałem tylko nadzieję, że istnieje prosty sposób kompilacji do wersji 32-bitowej bez konieczności instalowania 32-bitowego MatLab. Nawiasem mówiąc, w ogóle nie używam deploytool ręcznie. Po prostu pozwoliłem, aby vs2010 skompilował wszystko dla mnie. – Tiddo

+1

Po prostu przeczytałem twoją odpowiedź trochę lepiej, ale nadal nie rozumiem, dlaczego mój program nie działa: nie używam żadnych buildtoolsów z MATLAB, po prostu dołączam linki do bibliotek i bibliotek dll, więc mój program może korzystaj z silnika. O ile mogę zrozumieć, deploytool jest po prostu narzędziem, które kompiluje program z poprawnymi ustawieniami dla plików MEX. Jednak nie buduję pliku MEX i ręcznie konfiguruję potrzebne ustawienia. Ale czy w jakiś sposób należy ustawić ustawienia w taki sposób, że mogę eksportować do 32 bitów bez konieczności instalacji wersji 32-bitowej? – Tiddo

+1

@ Tiddo jakich używasz bibliotek? W mojej 64-bitowej instalacji są tylko 64-bitowe biblioteki w extern/lib/win64, więc nie mogą być użyte do zbudowania 32-bitowej wersji – stijn

Powiązane problemy