Компиляция 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(&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 установить dir
  • MlMatlabx64Dir: путь к matlab 64bit установить dir
  • MlMatlabProjDir: путь к 'project' dir с M-файлами для компиляции
  • MlMatlabSrcDir: путь с дополнительными исходными M-файлами
  • MlOutDir: выходной каталог
  • MlOutputName: имя вывода