Генерация автономных исполняемых файлов 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

На вкладке Apps MATLAB Toolstrip, в разделе 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.

Определите входные типы

Поскольку 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 шагу.

Сгенерируйте C main Функция

Когда вы генерируете исполняемый файл, вы должны предоставить основную функцию 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 так, чтобы он печатал результаты a 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_terminate.h"
    
    int main()
    {
        /* The initialize function is called automatically from the generated entry-point function. 
           So, a call to initialize is not included here. */ 
        
        printf("coderand=%g\n", coderand());
        
        coderand_terminate();
        
        return 0;
    }

    Примечание

    В этом примере, поскольку метод разделения файлов по умолчанию состоит в том, чтобы сгенерировать один файл для каждого файла MATLAB, вы включаете "coderand_terminate.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, что вызывает ошибку при генерации кода С++. Основной файл можно задать из диалогового окна параметров проекта, командной строки или диалогового окна Генерация кода.

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

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

  • Если для вашего метода разбиения файлов задано значение, чтобы сгенерировать один файл для каждого файла MATLAB, вы должны включить функцию заголовка terminate в main.c. В противном случае не включайте его в main.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 свойства объекта строения генерации кода (см. «Работа с объектами строения»). The 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.

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