Как создать файл mex непосредственно в Visual Studio? - программирование
Подтвердить что ты не робот

Как создать файл mex непосредственно в Visual Studio?

У меня есть решение Visual Studio 2010, которое содержит библиотеку функций, и я хотел бы иметь возможность использовать MATLAB в качестве одного из нескольких возможных интерфейсов для этой библиотеки. Поэтому я хотел бы, чтобы Visual Studio автоматически создавала файл mex при создании решения без необходимости экспортировать все мои варианты сборки и пути к mexopts.bat и открывать MATLAB для создания файла оттуда. Я видел несколько предложений для достижения чего-то подобного, например, в этих сообщениях:

Matlab 7.1+ и Visual Studio 2005

Компиляция MEX файла с помощью Visual Studio

Как использовать CMake и Visual Studio 2010 (64-разрядный) для создания файла MATLAB R2011a (64-разрядный)?

Однако они либо кажутся немного устаревшими (ссылаясь на файлы, которые больше не находят), либо используют внешние инструменты (например, CMake). Кто-нибудь знает, как настроить новый проект (в рамках существующего решения) в Visual Studio (2010 и новее), который будет создавать mex файл для современных выпусков MATLAB?

4b9b3361

Ответ 1

После некоторых экспериментов с рекомендациями этой страницы, упомянутых в вопросе, кажется, начиная с пустого проекта С++ следующие настройки в Страницы свойств проекта необходимы и достаточны для создания рабочего .mexw64 из Visual Studio 2010:

Configuration properties -> General:
    Set Target Extension to .mexw64
    Set Configuration Type to Dynamic Library (.dll)

Configureation poperties -> VC++ Directories:
    Add $(MATLAB_ROOT)\extern\include; to Include Directories

Configuration properties -> Linker -> General:
    Add $(MATLAB_ROOT)\extern\lib\win64\microsoft; to Additional Library Directories

Configuration properties -> Linker -> Input:
    Add libmx.lib;libmex.lib;libmat.lib; to Additional Dependencies

Configuration properties -> Linker -> Command Line:
    Add /export:mexFunction to Additional Options

$(MATLAB_ROOT) - это путь к корневой папке Matlab, например. C:\Program Files\MATLAB\R2013a.

До сих пор это было проверено только с помощью решения, созданного с нуля и построенного для 64-разрядной версии Matlab 2013. Я предполагаю, что для сборки для 32-разрядной версии необходимо изменить оба варианта с 64 по 32. Я обновляю сообщение, когда подтвержу, что это работает для существующего решения.

EDIT: Как и ожидалось, это работает для проектов, добавленных к существующим решениям. Не забудьте установить новый проект в зависимости от проекта, который создает библиотеку.

Изменить 2: Следуя этому вопросу Я могу подтвердить, что вышеуказанные шаги также работают в Visual Studio 2012 и 2013.

Ответ 2

Быстрая настройка проектов Visual Studio для файлов MEX с листом свойств

Все настройки могут быть применены через листы свойств, механизм быстрого применения конфигураций проекта Visual Studio.

Шаги:

  • Загрузите лист свойств (MATLAB.props) из этот репозиторий GitHib. Он короткий и сладкий. Я бы настоятельно рекомендовал вам сделать свой собственный, чтобы узнать, что участвует в этом процессе. Подробнее см. В разделе "Сведения о листе свойств" ниже.
  • Задайте коренные переменные среды MATLAB: MATLAB_ROOT для вашей 64-битной установки MATLAB и MATLAB32_ROOT для любых 32-разрядных установок MATLAB (например, C:\Program Files\MATLAB\R2014b\). Эта папка имеет подкаталоги bin, extern, sys и т.д. Перезапустите VS, если он был открыт.
  • Создайте пустой проект DLL в Visual Studio, возможно, создав платформу для решения x64. Сделайте это, выбрав "Win32 Project" и выбрав DLL следующим образом:

enter image description here

  1. В "Property Manager" (выберите из меню "Вид" ) для каждой конфигурации сборки проекта щелкните правой кнопкой мыши и выберите "Добавить существующий лист свойств..." и выберите соответствующий лист свойств (32 или 64 бит). (См. Снимок экрана ниже)

enter image description here

Что это!

Просто помните, что при переходе между MATLAB для использования вашего файла MEX и Visual Studio для создания новой версии необходимо будет запустить clear mex или clear specificMEXFileName, чтобы перезаписать его. Таким образом, я строю почти все мои файлы MEX.

ОБНОВЛЕНИЕ (05/22/15): файл MATLAB.props теперь поддерживает панель инструментов параллельных вычислений для использования объектов mxGPUArray. Если на вашем компьютере существует путь и библиотека инструментов (gpu.lib), они могут использоваться. Просто включите CUDA SDK "Настройка сборки" (который должен быть установлен, если вы установили CUDA SDK и установили интеграцию Visual Studio), чтобы включить cuda_runtime.h и т.д. Наконец, ссылку на cudart_static.lib(но продолжайте Inherit.., или вы получите другие ошибки компоновщика).


Сведения о листе свойств

В таблице свойств есть только несколько важных настроек:

  • Добавление $(MATLAB_ROOT)\extern\include в пути AdditionalIncludeDirectories (с унаследованными путями из родительских конфигураций) - расположение mex.h.
  • Добавление $(MATLAB_ROOT)\extern\lib\win64\microsoft в пути AdditionalLibraryDirectories - расположение libmex.lib и т.д.
  • Список библиотек: libut.lib;libmx.lib;libmex.lib;libmat.lib.
  • Экспорт mexFunction (это общая библиотека): /EXPORT:mexFunction.
  • Настройка расширения выходного файла (например, .mexw64 для x64).

Не нужно, но также указывает выходной манифест, который НЕ внедрен в библиотеку, устанавливает MATLAB_MEX_FILE и включает генерацию данных, необходимых для профилирования.

Обратите внимание на то, что существует более формальная система build configuration" для конфигурации проекта, которая включает в себя лист свойств, но свободный лист свойств достаточно для создания простого проекта MEX.

Примечание о -largeArrayDims

Параметр -largeArrayDims - это переключатель в команду mex в MATLAB, который просто указывает, что не следует определять MX_COMPAT_32. Таким образом, в Visual Studio вам не нужно ничего делать, поскольку по умолчанию это не определено. Если вам требуется противоположное поведение (-compatibleArrayDims), определите MX_COMPAT_32 в разделе "Препроцессор".


Что такое libut.lib для?

Я включаю libut.lib, который предоставляет несколько полезных функций для обнаружения прерывания (CTRL-C) из файла MEX. Соответствующие декларации (хотя это выходит из темы):

// prototype the break handling functions in libut (C library)
extern "C" bool utIsInterruptPending();
extern "C" void utSetInterruptPending(bool);

Ответ 3

Для создания/компоновки/компиляции автоматизируйте визуальную студию с расширением или макросом

  • запустите тонкий клиент Matlab (используя -nojvm -noawt -nodesktop -nosplash параметры командной строки, это начинается менее чем за секунду на моей машине)
  • генерировать двоичный код, вызывая mex (включая другие зависимости и т.д.).
  • Если отладка активирована, присоедините отладчик визуальной студии к вашему недавно запущенному тонкому клиенту matlab (любые точки останова, которые вы нажимаете в VS, будут активны).

Я автоматизировал это для visual studio 2010. Таким образом, вы полностью работаете с вашей mex-wrapper из IDE визуальной студии, имеете 4 дополнительных кнопки для отладки и т.д. Ошибки компиляции повторяются из окна терминала matlab, а не внутри Visual Студия. Найти макросы, загруженные здесь:

http://www.mathworks.se/matlabcentral/fileexchange/39549-visual-studio-toolbar-for-mex-interface-with-video-tutorial