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("$(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>
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
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
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
@ 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