Генерация Автономных Исполняемых файлов C/C++ из кода MATLAB

Сгенерируйте исполняемый файл C Используя приложение MATLAB Coder

Этот пример показывает, как сгенерировать исполняемый файл C из кода MATLAB® с помощью приложения MATLAB Coder™. В этом примере вы генерируете исполняемый файл для функции MATLAB, которая генерирует случайное скалярное значение. Используя приложение, вас:

  1. Сгенерируйте пример C функция main, которая вызывает сгенерированную библиотечную функцию.

  2. Скопируйте и измените сгенерированный main.c и main.h.

  3. Измените настройки проекта так, чтобы приложение могло найти измененный main.c и main.h.

  4. Сгенерируйте исполняемый файл.

Создайте функцию точки входа

В локальной перезаписываемой папке создайте функцию MATLAB, coderand, который генерирует случайное скалярное значение от стандартного равномерного распределения на открытом интервале (0,1):

function r = coderand() %#codegen
r = rand();

Создайте тестовый файл

В той же локальной перезаписываемой папке создайте файл MATLAB, coderand_test.m, который вызывает coderand.

function y = coderand_test()
y = coderand();

Откройте приложение MATLAB Coder

На вкладке MATLAB Toolstrip Apps, под Code Generation, кликают по значку приложения MATLAB Coder.

Приложение открывает страницу Select Source Files.

Задайте исходные файлы

  1. На странице Select Source Files введите или выберите имя функции точки входа coderand.

    Приложение создает проект с именем по умолчанию coderand.prj в текущей папке.

  2. Нажмите Next, чтобы перейти к шагу Define Input Types. Приложение анализирует функцию для кодирования готовность генерации кода и проблемы. Если приложение идентифицирует проблемы, оно открывает страницу Review Code Generation Readiness, где можно рассмотреть и устранить проблемы. В этом примере, потому что приложение не обнаруживает проблемы, оно открывает страницу Define Input Types.

Входные Define типы

Поскольку C использует статический контроль типов, во время компиляции, MATLAB Coder должен определить свойства всех переменных в файлах MATLAB. Необходимо задать свойства всех входных параметров функции точки входа. Из свойств входных параметров функции точки входа MATLAB Coder может вывести свойства всех переменных в файлах MATLAB.

В этом примере функциональный coderand не имеет входных параметров.

Нажмите Next, чтобы перейти к шагу Check for Run-Time Issues.

Проверяйте на проблемы во время выполнения

Шаг Check for Run-Time Issues генерирует файл MEX от ваших функций точки входа, запускает MEX-функцию и сообщает о проблемах. Этот шаг является дополнительным. Однако это - лучшая практика выполнить этот шаг. Можно обнаружить и зафиксировать ошибки времени выполнения, которые более трудно диагностировать в сгенерированном коде C.

  1. Чтобы открыть диалоговое окно Check for Run-Time Issues, кликните по стрелке Check for Issues.

    Выберите или введите тестовый файл coderand_test.

  2. Нажмите Check for Issues.

    Приложение генерирует MEX-функцию для coderand. Это запускает тестовый файл, заменяющий вызовы coderand с вызовами MEX-функции. Если приложение обнаруживает проблемы во время генерации MEX-функции или выполнения, это предоставляет предупреждающие сообщения и сообщения об ошибке. Кликните по этим сообщениям, чтобы перейти к проблематичному коду и устранить проблему. В этом примере приложение не обнаруживает проблемы.

  3. Нажмите Next, чтобы перейти к шагу Generate Code.

Сгенерируйте функцию main C

Когда вы генерируете исполняемый файл, необходимо обеспечить функцию C/C++. По умолчанию, когда вы генерируете исходный код C/C++, статические библиотеки, динамически подключаемые библиотеки или исполняемые файлы, MATLAB Coder генерирует функцию main. Эта сгенерированная основная функция является шаблоном, который вы изменяете для своего приложения. Смотрите Включают Сгенерированный код Используя Пример Основная Функция. После того, как вы скопируете и измените сгенерированную основную функцию, можно использовать ее для генерации исполняемого файла C/C++. Также можно записать собственную основную функцию.

Прежде чем вы сгенерируете исполняемый файл для coderand, сгенерируете функцию main, которая вызывает coderand.

  1. Чтобы открыть диалоговое окно Generate, кликните по стрелке Generate.

  2. В диалоговом окне Generate, набор Build type к Source Code и Language к C. Используйте значения по умолчанию для других настроек конфигурации сборки проекта.

  3. Нажмите More Settings.

  4. На вкладке All Settings, под Advanced, проверяют, что Generate example main установлен в Generate, but do not compile, an example main function. Нажмите Close.

  5. Нажмите Generate.

    MATLAB Coder генерирует файл main.c и файл main.h. Приложение указывает на ту генерацию кода, за которой следуют.

  6. Нажмите Next, чтобы открыть страницу Finish Workflow.

    На странице Finish Workflow, под Generated Output, вы видите, что main.c находится в подпапке coderand\codegen\lib\coderand\examples.

Скопируйте сгенерированный пример основные файлы

Поскольку последующая генерация кода может перезаписать сгенерированные файлы в качестве примера, прежде чем вы измените эти файлы, скопируете их в перезаписываемую папку за пределами папки codegen. В данном примере скопируйте main.c и main.h от подпапки coderand\codegen\lib\coderand\examples до перезаписываемой папки, например, c:\myfiles.

Измените сгенерированный пример основные файлы

  1. В папке, которая содержит копию примера основные файлы, открытый main.c.

     Сгенерированный main.c

  2. Измените main.c так, чтобы он распечатал результаты вызова coderand:

    • В main_coderand удалите строку

      double r;

    • В main_coderand, замене

      r = coderand()
      с
      printf("coderand=%g\n", coderand());

    • В данном примере main не имеет аргументов. В main удалите строки:

      (void)argc;
      (void)argv;

      Измените определение main к

      int main()

     Измененный main.c

  3. Открытый main.h

     Сгенерированный main.h

  4. Измените main.h:

    • Добавьте stdio во включать файлы:

      #include <stdio.h>

    • Измените объявление основного к

      extern int main()

 Измененный main.h

Сгенерируйте исполняемый файл

  1. Чтобы открыть страницу Generate Code, расширьте шаги рабочего процесса и нажмите Generate

  2. Чтобы открыть диалоговое окно Generate, кликните по стрелке Generate.

  3. Установите Build type на Executable (.exe).

  4. Нажмите More Settings.

  5. На вкладке Custom Code, в Additional source files, вводят main.c

  6. На вкладке Custom Code, в Additional include directories, вводят местоположение измененного main.c и файлов main.h. Например, c:\myfiles. Нажмите Close.

  7. Чтобы сгенерировать исполняемый файл, нажмите Generate.

    Приложение указывает на ту генерацию кода, за которой следуют.

  8. Нажмите Next, чтобы перейти к шагу Finish Workflow.

  9. Под Generated Output вы видите местоположение сгенерированного исполняемого coderand.exe.

Запустите исполняемый файл

Запускать исполняемый файл в MATLAB на платформе Windows®:

system('coderand')

Сгенерируйте исполняемый файл C в командной строке

В этом примере вы создаете функцию MATLAB, которая генерирует случайное скалярное значение и основную функцию C, которая вызывает эту функцию MATLAB. Вы затем задаете типы для параметров входного параметра функции, задаете основную функцию и генерируете исполняемый файл C для кода MATLAB.

  1. Запишите функцию MATLAB, coderand, который генерирует случайное скалярное значение от стандартного равномерного распределения на открытом интервале (0,1):

    function r = coderand() %#codegen
    r = rand();
  2. Запишите основную функцию C, c:\myfiles\main.c, который вызывает coderand. Например:

    /*
    ** main.c
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include "coderand.h"
    #include "coderand_initialize.h"
    #include "coderand_terminate.h"
    
    int main()
    {
        coderand_initialize();
        
        printf("coderand=%g\n", coderand());
        
        coderand_terminate();
        
        return 0;
    }

    Примечание

    В этом примере, потому что метод разделения файла по умолчанию должен сгенерировать один файл для каждого файла MATLAB, вы включаете "coderand_initialize.h" и "coderand_terminate.h". Если ваш метод разделения файла собирается сгенерировать один файл для всех функций, не включайте "coderand_initialize.h" и "coderand_terminate.h".

  3. Сконфигурируйте свои параметры генерации кода, чтобы включать основной C, функционируют и затем генерируют исполняемый файл C:

    cfg = coder.config('exe');
    cfg.CustomSource = 'main.c';
    cfg.CustomInclude = 'c:\myfiles';
    codegen -config cfg coderand 

    codegen генерирует исполняемый файл C, coderand.exe, в текущей папке. Это генерирует вспомогательные файлы в папке по умолчанию, codegen/exe/coderand. codegen генерирует минимальный набор операторов #include для заголовочных файлов, требуемых выбранной заменяющей библиотекой кода.

Определение основных Функций для Исполняемых файлов C/C++

Когда вы генерируете исполняемый файл, необходимо обеспечить функцию main. Для исполняемого файла C обеспечьте файл C, main.c. Для исполняемого файла C++ обеспечьте файл C++, main.cpp. Проверьте, что папка, содержащая основную функцию, имеет только один основной файл. В противном случае main.c более приоритетен по сравнению с main.cpp, который вызывает ошибку при генерации Кода С++. Можно задать основной файл от диалогового окна настроек проекта, командной строки или диалогового окна Code Generation.

По умолчанию, когда вы генерируете исходный код C/C++, статические библиотеки, динамически подключаемые библиотеки или исполняемые файлы, MATLAB Coder генерирует функцию main. Эта сгенерированная основная функция является шаблоном, который вы изменяете для своего приложения. Смотрите Включают Сгенерированный код Используя Пример Основная Функция. После того, как вы скопируете и измените сгенерированную основную функцию, можно использовать ее для генерации исполняемого файла C/C++. Также можно записать собственную основную функцию.

Когда вы преобразовываете функцию MATLAB в библиотечную функцию C/C++ или исполняемый файл C/C++, MATLAB Coder генерирует инициализировать функцию и оконечную функцию.

  • Если ваш метод разделения файла собирается сгенерировать один файл для каждого файла MATLAB, необходимо включать инициализирование и оконечные функции заголовка в main.c. В противном случае не включайте их в main.c.

  • Необходимо вызвать эти функции наряду с функцией C/C++. Для получения дополнительной информации смотрите, что Вызов Инициализирует и Отключает Функции.

Задайте основные Функции

Определение основных Функций Используя Приложение MATLAB Coder

  1. Чтобы открыть диалоговое окно Generate, на странице Generate Code, кликают по стрелке Generate.

  2. Нажмите More Settings.

  3. На вкладке Custom Code, наборе:

    1. Additional source files к имени исходного файла C/C++, который содержит функцию main. Например, main.c. Для получения дополнительной информации смотрите Задающие основные Функции для Исполняемых файлов C/C++.

    2. Additional include directories к местоположению main.c. Например, c:\myfiles.

Определение основных Функций в Командной строке

Установите свойства CustomSource и CustomInclude объекта настройки генерации кода (см. Работу с Объектами Настройки). Свойство CustomInclude указывает на местоположение файлов C/C++, заданных CustomSource.

  1. Создайте объект настройки для исполняемого файла:

    cfg = coder.config('exe');
    
  2. Установите свойство CustomSource на имя исходного файла C/C++, который содержит функцию main. (Для получения дополнительной информации смотрите Задающие основные Функции для Исполняемых файлов C/C++.), Например:

    cfg.CustomSource = 'main.c';

  3. Установите свойство CustomInclude на местоположение main.c. Например:

    cfg.CustomInclude = 'c:\myfiles';

  4. Сгенерируйте исполняемый файл C/C++ использование параметров командной строки. Например, если myFunction берет входной параметр того типа double:

    codegen -config cfg  myMFunction -args {0}

    MATLAB Coder компилирует и соединяет основную функцию с кодом C/C++, который это генерирует от myMFunction.m.