Как создать файл 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?
Ответы
Ответ 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]()
- В "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