Как создать 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-разрядная версия) для создания MEX-файла MATLAB R2011a (64-разрядная версия)?

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


person j0rre    schedule 23.05.2013    source источник


Ответы (3)


После некоторых экспериментов с руководством с этой страницы, упомянутой в вопросе, кажется, что начинается с пустым проектом C++ следующие параметры на страницах свойств проекта необходимы и достаточны для создания работающего .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 2013a. Я предполагаю, что для сборки для 32-разрядной версии нужно всего лишь изменить оба вхождения 64 на 32. Я обновлю пост, когда подтвержу, что это работает для существующего решения.

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

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

person j0rre    schedule 23.05.2013
comment
Работает ли это для Visual Studio 2015 и Visual Studio 2017? Спасибо. - person Royi; 05.08.2017
comment
Visual Studio 2017 Pro. Я точно следовал инструкциям в новом проекте mex. Работает отлично :). Это самая краткая инструкция, которую я нашел в сети. - person Tyson Hilmer; 16.03.2018

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

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

Шаги:

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

введите здесь описание изображения

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

введите здесь описание изображения

Вот и все!

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

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


Подробности страницы свойств

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

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

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

Для полноты картины обратите внимание, что существует более формальная "конфигурация сборки" система для конфигурации проекта, которая включает лист свойств, но отдельного листа свойств достаточно для настройки простого проекта 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);
person chappjc    schedule 10.12.2014
comment
Разрешите поздравить вас с 20к :). Это голосование должно привести вас туда! К тому же очень полезная информация. Спасибо! - person rayryeng; 22.01.2015
comment
Как насчет того, чтобы сделать это на GCC? - person Royi; 07.08.2017
comment
@Royi stackoverflow .com/questions/8552580/ - person chappjc; 07.08.2017
comment
Выглядит неплохо. Я бы добавил это в качестве примечания к вашему ответу. Спасибо (+1)! - person Royi; 07.08.2017

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

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

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

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

person Stefan Karlsson    schedule 24.12.2013