По умолчанию, во время генерации кода, MATLAB® Coder™ делит код, чтобы совпадать с вашей структурой файла MATLAB. Это взаимно-однозначное отображение позволяет вам легко коррелировать свои файлы, сгенерированные на C/C++ со скомпилированным кодом MATLAB. MATLAB Coder не может произвести то же взаимно-однозначное соответствие для функций MATLAB, которые встраиваются в сгенерированном коде (см., что Файл Делит и Встраивает).
Также можно выбрать, чтобы сгенерировать все функции C/C++ в один файл. Для получения дополнительной информации смотрите, Как Выбрать File Partitioning Method. Эта опция упрощает интеграцию вашего кода с существующим встроенным программным обеспечением.
Чтобы открыть диалоговое окно Generate, на странице Generate Code, кликают по стрелке Generate.
Нажмите More Settings.
На вкладке Code Appearance, набор Generated file partitioning method к Generate one file for each MATLAB file
или Generate all functions into a single file
.
Используйте опцию объекта FilePartitionMethod
настройки codegen
. Например, чтобы скомпилировать функциональный foo
, который не имеет никаких входных параметров и генерирует один файл C/C++ для каждой функции MATLAB:
Создайте объект настройки MEX и установите опцию FilePartitionMethod
:
mexcfg = coder.config('mex'); mexcfg.FilePartitionMethod = 'MapMFileToCFile';
Используя опцию -config
, передайте объект настройки codegen
:
codegen -config mexcfg -O disable:inline foo % Disable inlining to generate one C/C++ file for each MATLAB function
По умолчанию, для функций MATLAB, которые не встраиваются, MATLAB Coder генерирует один файл C/C++ для каждого файла MATLAB. В этом случае разделы MATLAB Coder сгенерировали код C/C++ так, чтобы он соответствовал вашим файлам MATLAB.
Для каждой точки входа (верхний уровень) функция MATLAB MATLAB Coder генерирует один источник C/C++, заголовок и объектный файл с тем же именем как файл MATLAB.
Например, предположите, что вы задаете простой функциональный foo
, который вызывает функциональный identity
. Исходный файл foo.m
содержит следующий код:
function y = foo(u,v) %#codegen s = single(u); d = double(v); y = double(identity(s)) + identity(d);
Вот код для identity.m
:
function y = identity(u) %#codegen y = u;
В приложении MATLAB Coder, чтобы сгенерировать статическую библиотеку C для foo.m
:
Задайте входные параметры u
и v
. Для получения дополнительной информации смотрите Specify Properties Входных параметров функции Точки входа Используя Приложение.
Чтобы открыть диалоговое окно Generate, на странице Generate Code, кликают по стрелке Generate.
Установите Build type на Static Library
Нажмите More Settings.
На вкладке All Settings, под Function Inlining, устанавливает параметр Inline threshold на 0
Нажмите Close
Чтобы сгенерировать библиотеку, нажмите Generate.
Сгенерировать статическую библиотеку C для foo.m
, в командной строке, введите:
codegen -config:lib -O disable:inline foo -args {0, 0} % Use the -args option to specify that u and v are both % real, scalar doubles
MATLAB Coder генерирует источник, заголовок и объектные файлы для foo
и identity
в вашей выходной папке.
Для каждой локальной функции MATLAB Coder генерирует код в том же файле C/C++ как функция вызова. Например, предположите, что вы задаете функциональный foo
, который вызывает локальную функцию identity
:
function y = foo(u,v) %#codegen s = single(u); d = double(v); y = double(identity(s)) + identity(d); function y = identity(u) y = u;
Чтобы сгенерировать библиотеку C++, прежде, чем сгенерировать код, выбирают компилятор C ++ и устанавливают C++ как ваш выходной язык. Например, в командной строке:
Выберите C ++ как свой выходной язык:
cfg = coder.config('lib') cfg.TargetLang='C++'
Сгенерируйте библиотеку C++:
codegen -config cfg foo -args {0, 0} % Use the -args option to specify that u and v are both % real, scalar doubles
В первичной функции foo
MATLAB Coder встраивает код для локальной функции identity
.
Если вы задаете C++
, MATLAB Coder переносит код C
в файлы .cpp
так, чтобы можно было использовать компилятор C++
и интерфейс с внешними приложениями C++
. Это не генерирует классы C++
.
Вот выборка сгенерированного кода в foo.cpp
:
... /* Function Definitions */ double foo(double u, double v) { return (double)(float)u + v; } ...
Перегруженная функция является функцией, которая имеет несколько реализаций, чтобы разместить различные классы входа. Для каждой реализации (который не встраивается), MATLAB Coder генерирует разделять файл C/C++ с уникальным числовым суффиксом.
Например, предположите, что вы задаете простой функциональный multiply_defined
:
%#codegen function y = multiply_defined(u) y = u+1;
Вы затем добавляете еще две реализации multiply_defined
, один, чтобы обработать входные параметры типа single
(в подпапке @single
) и другой для входных параметров типа double
(в подпапке @double
).
Чтобы вызвать каждую реализацию, задайте функциональный call_multiply_defined
:
%#codegen function [y1,y2,y3] = call_multiply_defined y1 = multiply_defined(int32(2)); y2 = multiply_defined(2); y3 = multiply_defined(single(2));
Затем, сгенерируйте код С для перегруженной функции multiply_defined
. Например, в командной строке MATLAB, введите:
codegen -O disable:inline -config:lib call_multiply_defined
MATLAB Coder генерирует источник C, заголовок и объектные файлы для каждой реализации multiply_defined
, как подсвечено. Используйте числовые суффиксы, чтобы создать уникальные имена файлов.
Типы и местоположения сгенерированных файлов зависят от цели, которую вы задаете. Для всех целей, если ошибки или предупреждения происходят во время сборки или если вы явным образом запрашиваете отчет, MATLAB Coder генерирует отчеты.
Каждый раз, когда MATLAB Coder генерирует тот же тип вывода для того же кода или проекта, это удаляет файлы из предыдущей сборки. Если вы хотите сохранить файлы от сборки, скопируйте их в другое место прежде, чем запустить другую сборку.
По умолчанию MATLAB Coder генерирует следующие файлы для MEX-функции (mex
) цели.
Тип файлов | Местоположение |
---|---|
Специфичные для платформы файлы MEX | Текущая папка |
MEX, и источник C/C++, заголовок и объектные файлы | codegen/mex/function_name |
Отчеты HTML | codegen/mex/function_name /html |
По умолчанию MATLAB Coder генерирует следующие файлы для C/C++ статические цели библиотеки.
Тип файлов | Местоположение |
---|---|
Источник C/C++, библиотека, заголовок и объектные файлы | codegen/lib/function_name |
Отчеты HTML | codegen/lib/function_name /html |
По умолчанию MATLAB Coder генерирует следующие файлы для C/C++ динамические цели библиотеки.
Тип файлов | Местоположение |
---|---|
Источник C/C++, библиотека, заголовок и объектные файлы | codegen/dll/function_name |
Отчеты HTML | codegen/dll/function_name /html |
По умолчанию MATLAB Coder генерирует следующие файлы для исполнимых целей C/C++.
Тип файлов | Местоположение |
---|---|
Источник C/C++, заголовок и объектные файлы | codegen/exe/function_name |
Отчеты HTML | codegen/exe/function_name /html |
Используя приложение MATLAB Coder
Измениться | Действие |
---|---|
Имя выходного файла |
|
Местоположение выходного файла |
|
В Командной строке. Можно изменить название и местоположение сгенерированных файлов при помощи опций codegen
-o
и -d
.
То, как разделы MATLAB Coder сгенерировали код C/C++, зависит от того, принимаете ли вы решение сгенерировать один файл C/C++ для каждого файла MATLAB и встраиваете ли вы свои функции MATLAB.
Если вы | MATLAB Coder |
---|---|
Сгенерируйте все функции C/C++ в один файл и отключите встраивание | Генерирует один файл C/C++, не встраивая функции. |
Сгенерируйте все функции C/C++ в один файл и позвольте встроить | Генерирует один файл C/C++. Встраивает функции, размеры которых находятся в пределах порога встраивания. |
Сгенерируйте один файл C/C++ для каждого файла MATLAB и отключите встраивание | Разделы сгенерировали код C/C++, чтобы совпадать со структурой файла MATLAB. Смотрите Разделение Сгенерированные Файлы с Одним Файлом C/C++ На файл MATLAB. |
Сгенерируйте один файл C/C++ для каждого файла MATLAB и позвольте встроить | Места встроили функции в том же файле C/C++ как функция, в которую они встраиваются. Даже когда вы позволяете встроить, MATLAB Coder встраивает только те функции, размеры которых находятся в пределах порога встраивания. Для функций MATLAB, которые не встраиваются, MATLAB Coder делит сгенерированный код C/C++, как описано. |
Взвешивание разделения файла против встраивания представляет компромисс между удобочитаемостью, эффективностью и простотой интеграции вашего кода MATLAB с существующим встроенным программным обеспечением.
Если вы генерируете | Сгенерированный Код C/C++ | Преимущества | Недостатки |
---|---|---|---|
Весь C/C++ функционирует в один файл | Не совпадает со структурой файла MATLAB | Легче объединяться с существующим встроенным программным обеспечением | Трудный сопоставить код C/C++ с исходным файлом MATLAB |
Один C/C ++-file для каждого файла MATLAB и позволяет встроить | Точно не совпадает со структурой файла MATLAB | Программа выполняется быстрее | Трудный сопоставить код C/C++ с исходным файлом MATLAB |
Один C/C ++-file для каждого файла MATLAB и отключает встраивание | Структура файла MATLAB соответствий | Легкий сопоставить код C/C++ с исходным файлом MATLAB | Программа запускается менее эффективно |
Встраивание включено по умолчанию. Поэтому, чтобы сгенерировать один файл C/C++ для каждой функции MATLAB верхнего уровня, вы должны:
Выберите, чтобы сгенерировать один файл C/C++ для каждой функции MATLAB верхнего уровня. Для получения дополнительной информации смотрите, Как Выбрать File Partitioning Method.
Явным образом отключите встраивание, или глобально или для отдельных функций MATLAB.
Как отключить встраивание глобально Используя приложение MATLAB Coder
Чтобы открыть диалоговое окно Generate, на странице Generate Code, кликают по стрелке Generate.
Нажмите More Settings.
На вкладке All Settings, под Function Inlining устанавливает Inline threshold на 0
.
Как Отключить Встраивание Глобально в Командной строке. Чтобы отключить встраивание функций, используйте опцию -O disable:inline
с codegen
. Например, чтобы отключить встраивание и сгенерировать MEX-функцию для функционального foo
, который не имеет никаких входных параметров:
codegen -O disable:inline foo
Для получения дополнительной информации см. описание codegen
.
Как Отключить Встраивание для Отдельных Функций. Чтобы отключить встраивание для отдельной функции MATLAB, добавьте направляющий coder.inline('never');
на отдельной строке в исходном файле MATLAB после функциональной подписи.
function y = foo(u,v) %#codegen coder.inline('never'); s = single(u); d = double(v); y = double(identity(s)) + identity(d);
codegen
не встраивает функции точки входа.
Директива coder.inline
применяется только к функции, в которой это появляется. В этом примере встраивание отключено для функционального foo
, но не для identity
, функции, определяемой верхнего уровня в отдельном файле MATLAB и вызвано foo
. Чтобы отключить встраивание для identity
, добавьте эту директиву после ее функциональной подписи в исходном файле identity.m
. Для получения дополнительной информации смотрите coder.inline
.
Для более эффективного способа отключить встраивание для обеих функций, смотрите, Как Отключить Встраивание Глобально в Командной строке.
Чтобы коррелировать код C/C++, который вы генерируете с исходными встроенными функциями, добавьте комментарии в коде MATLAB, чтобы идентифицировать функцию. Эти комментарии появятся в коде C/C++ и помогут вам сопоставить сгенерированный код назад с исходными функциями MATLAB.
Чтобы изменить поведение встраивания, настройте пороговый параметр встраивания.
Изменение порога встраивания Используя приложение MATLAB Coder
Чтобы открыть диалоговое окно Generate, на странице Generate Code, кликают по стрелке Generate.
Нажмите More Settings.
На вкладке All Settings, под Function Inlining, устанавливает значение параметра Inline threshold.
Изменение Порога Встраивания в Командной строке. Установите значение параметра InlineThreshold
объекта настройки. Смотрите coder.MexCodeConfig
, coder.CodeConfig
, coder.EmbeddedCodeConfig
.