Компиляция 32-битного приложения matlab на 64-битной машине (c++)
в настоящее время я создаю 32-битное приложение MatLab-engine на c++ на 64-битной машине с установленным 64-битным MatLab. Тем не менее, у меня есть все dll и библиотечные файлы в 32-битном для движка MatLab. Файлы библиотеки и dll загружаются правильно (я могу скомпилировать и запустить приложение без каких-либо ошибок, которые я получу, когда буду использовать 64-битные dll/libs), но 32-битные dll, по-видимому, запускают 64-битный исполняемый файл matlab, поэтому моя программа вылетает, как только я пытаюсь сделать что-то с двигателем. Есть ли способ заставить мое приложение запускать 32-разрядный исполняемый файл matlab вместо 32-разрядного?
спасибо заранее!
1 ответов
это возможно, но это очень грязно: вся система mbuild/deploytool является частью cr*p, на мой взгляд. Первая проблема с deploytool.bat - это то, что, хотя и имеет опцию "- win32", это не имеет никакого эффекта, когда deploytool не вызывается из 32-битного каталога установки. Вторая проблема заключается в том, что параметры mbuild являются общими для 32 и 64-разрядных версий, поэтому их необходимо указать вручную, поскольку используются неправильные параметры компилятора.
вот некоторые вещи, которые я сделал, чтобы скомпилировать 32bit и 64bit с 64-битной машины windows с установленным VS2010.
- вы должны установить оба 32bit и 64bit версий Матлаба
- вам придется делать все из командной строки
- вы не можете редактировать свои .файлы prj через интерфейс deploytool, потому что он закручивает все ручные изменения, внесенные в них. (ну, это на самом деле преимущество, так как теперь, по крайней мере, вы сможете хранить их в VCS)
- укажите на правильный параметры компилятора путем добавления
<param.c.cpp.options.file>
в prj в разделе "Конфигурация" (см. ниже) - построить manully давая полный путь к deploytool.летучая мышь 32-битной установки
параметры конфигурации файла в prj:
<deployment-project>
<configuration ....>
....
<param.c.cpp.options.file>${MATLAB_ROOT}\bin\win32\mbuildopts\msvc100compp.bat</param.c.cpp.options.file>
....
обратите внимание, что выходной dir и т. д. будет одинаковым для 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>
ему нужны следующие свойства:
- MlPlatform: x86 для сборки 32 бит, x64 для сборки 64 бит
- MlMatlabx86Dir: путь к matlab 32bit установить dir
- MlMatlabx64Dir: путь к matlab 64bit установить dir
- MlMatlabProjDir: путь к 'project' dir с M-файлами для компиляции
- MlMatlabSrcDir: путь с дополнительными исходными M-файлами
- MlOutDir: выходной каталог
- MlOutputName: имя вывода