exponenta event banner

Добавление зависимостей процесса построения

При указании системного целевого файла для создания кода генератор кода может создать автономную исполняемую программу, которая может выполняться на компьютере разработчика. Для построения исполняемой программы генератор кода использует выбранный компилятор и make-файл, созданный с помощью метода процесса построения toolchain или template makefile (TMF). Частью процесса создания makefile является добавление информации об исходном файле, файле заголовка и файле библиотеки (зависимостей) в созданный makefile для компиляции. Кроме того, для конкретного приложения можно добавить сгенерированные файлы и зависимости файлов с помощью системы управления конфигурацией.

Созданный код для модели состоит из небольшого набора файлов. (См. раздел Управление файлами процесса построения.) Эти файлы имеют зависимости от других файлов, которые возникают из-за:

  • Включения заголовочных файлов

  • Объявления макросов

  • Вызовы функций

  • Объявления переменных

Модель или внешний код вводит зависимости по различным причинам:

  • Блоки в модели генерируют код, который вызывает функцию. Эти вызовы могут выполняться в нескольких формах:

    • Включенные исходные файлы (не сгенерированные) объявляют вызываемые функции. В таких случаях, как блоксеть, управляйте этими зависимостями исходных файлов, компилируя их в файл библиотеки.

    • Созданный код вызывает функции в библиотеке времени выполнения, предоставляемой компилятором.

    • Некоторые зависимости функций также являются сгенерированными файлами, которые называются общими утилитами. В качестве примеров можно привести утилиты с фиксированной точкой и функции поддержки, не являющиеся конечными. Эти зависимости называются общими утилитами. Созданные функции могут отображаться в файлах в папке сборки для автономных моделей или в папке _sharedutils в папке под slprj для построений, содержащих ссылку на модель.

  • Модели с непрерывным временем требуют файлов исходного кода решателя.

  • Параметры генератора кода, такие как внешний режим, C API и ведение журнала файлов MAT.

  • Внешний код указывает зависимости.

Сведения о зависимости файлов для процесса построения

Генератор кода предоставляет несколько механизмов для ввода информации о зависимости файла в процесс построения. Механизмы зависят от того, основаны ли зависимости на блоках, на моделях или на системных целевых файлах.

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

  • S-функции и блоки

    • Добавьте папки, содержащие MEX-файлы S-функции, которые используются моделью в путь к заголовку, включая путь.

    • Создайте правила makefile для этих папок, чтобы разрешить поиск исходного кода.

    • Укажите дополнительные имена исходных файлов с помощью параметра блока S-Function SFunctionModules.

    • Укажите дополнительные зависимости с помощью rtwmakecfg.m механизм. См. раздел Использование API rtwmakecfg.m для настройки созданных Makefiles.

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

  • Блок S-Function Builder, предоставляющий собственный пользовательский интерфейс для указания информации о зависимостях

Для целевых файловых зависимостей модели или системы, таких как внешние заголовочные файлы, рекомендуется использовать:

  • Панель «Создание кода» > «Пользовательский код» в диалоговом окне «Параметры конфигурации». Можно указать дополнительные библиотеки, исходные файлы и папки.

  • Функции TLC LibAddToCommonIncludes() и LibAddToModelSources(). Во время фазы TLC можно указать зависимости. См. разделы LibAddToCommonIncludes (incFileName) и LibAddSourceFileCustomSection (файл, builtInSection, newSection). Продукт Embedded Coder ® также предоставляет шаблон настройки на основе TLC для создания дополнительных исходных файлов.

Созданные зависимости Makefile

Для процессов построения подхода к цепочке инструментов или шаблона makefile (TMF) генератор кода генерирует makefile. Для TMF созданный makefile обеспечивает расширение маркеров, в котором процесс построения расширяет различные маркеры в makefile, чтобы включить дополнительную информацию о зависимостях. Результирующий make-файл содержит полную информацию о зависимостях. См. раздел Настройка Makefiles шаблонов.

Созданный make-файл содержит:

  • Имена зависимостей исходных файлов

  • Папки, в которых находятся исходные файлы

  • Расположение файлов заголовков

  • Предкомпилированные зависимости библиотеки

  • Библиотеки, которые make утилита компилирует и создает

Свойство make это то, что вам не нужно указывать конкретное расположение для данного исходного файла C или C++. Если для этой папки существует правило, а имя исходного файла является обязательным условием в make-файле, утилита make может найти исходный файл и скомпилировать его. Компилятор C или C++ (препроцессор) не требует абсолютных путей к заголовкам. Компилятор находит файл заголовка с именем файла заголовка с помощью #include директива и путь включения. Сгенерированный исходный код C или C++ зависит от данной стандартной возможности компилятора.

Библиотеки создаются и связываются с, но закрывают определенные функции, вызываемые программой.

Эти свойства могут затруднить определение минимального списка зависимостей файлов вручную. Файл make можно использовать в качестве начальной точки для определения зависимостей в созданном коде.

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

Зависимости статических файлов генератора кода

Несколько расположений в дереве папок MATLAB ® содержат статические зависимости файлов, специфичные для генератора кода:

  • matlabroot/rtw/c/src (открыто)

    Эта папка имеет вложенные папки и содержит дополнительные файлы, которые необходимо скомпилировать. Примеры включают функции решателя (для непрерывной поддержки времени), файлы поддержки внешнего режима, файлы поддержки C API и файлы поддержки S-функций. Включить исходные файлы в этой папке в процесс построения с помощью SRC переменные make-файла.

  • Заголовочные файлы в папке matlabroot/rtw/extern/include

  • Заголовочные файлы в папке matlabroot/simulink/include

    Эти папки содержат дополнительные зависимости заголовочных файлов, такие как tmwtypes.h, simstruc_types.h, и simstruc.h.

    Примечание

    Для целевых системных файлов на основе ERT можно избежать нескольких зависимостей заголовков. Системные целевые файлы на основе ERT генерируют в файле минимальный набор определений типов, макросов и т.д. rtwtypes.h.

Статические файловые зависимости Blockset

Продукты Blockset с S-функциональным кодом применяют rtwmakecfg.m механизм обеспечения генератора кода информацией о зависимостях. rtwmakecfg.m файл из блоксети содержит список зависимостей пути включения и исходного пути для блоксети. Как правило, блоки создают библиотеку из исходных файлов, с которыми может быть связан созданный код модели. Библиотеки создаются и идентифицируются при использовании rtwmakecfg.m механизм.

Чтобы найти rtwmakecfg.m файлы для блоков в установленном дереве MATLAB, используйте следующую команду:

>> which -all rtwmakecfg.m

Если в компилируемой модели используется один или несколько блоков, перечисленных в which , можно определить информацию о зависимости папки и файла из соответствующего rtwmakecfg.m файл.

Сведения о зависимостях папок для процесса построения

Можно добавить #include операторов к сгенерированному коду. Такие ссылки могут поступать из нескольких источников, включая сценарии TLC для встраивания S-функций, пользовательские классы хранения, объекты шины и объекты типа данных. Включенные файлы состоят из заголовочных файлов для внешнего кода или других настроек. Можно указать пути включения компилятора с помощью -I параметр компилятора. Процесс построения использует указанные пути для поиска включенных файлов заголовков.

Сценарии использования для сгенерированного кода включают, помимо прочего, следующее:

  • Пользовательский процесс построения компилирует созданный код, для которого требуется определенный для среды набор #include заявления.

    В этом сценарии процесс построения вызывает генератор кода при выборе параметра конфигурации модели Только генерировать код. Рассмотрите возможность использования полных путей, относительных путей или только имен заголовочных файлов в #include заявления. Используйте пути включения.

  • Процесс построения компилирует созданный код.

    В этом случае можно указать пути включения компилятора (-I) для процесса построения несколькими способами:

    • Укажите дополнительные пути включения на панели «Создание кода» > «Пользовательский код» в диалоговом окне «Параметры конфигурации». Генератор кода распространяет пути включения в созданный файл make.

    • rtwmakecfg.m механизм позволяет S-функциям вводить дополнительные пути включения в процесс построения. Генератор кода распространяет пути включения в созданный файл make.

    • При построении модели, использующей пользовательский целевой файл системы и основанную на makefile, можно непосредственно добавить пути включения в файл makefile шаблона, используемый целевым файлом системы.

    • Используйте make для указания USER_INCLUDES make variable, определяющая папку, в которой процесс построения выполняет поиск включенных файлов. Например:

      make_rtw USER_INCLUDES=-Id:\work\feature1

      Процесс построения передает пользовательские компоненты в командную строку утилиты make, которая добавляет их к общим флагам, передаваемым компилятору.

Использовать #include Инструкции и пути включения

Рассмотрим следующие подходы к использованию #include операторы и включают пути с процессом сборки для создания кода, который остается портативным и сводит к минимуму проблемы совместимости с будущими версиями.

Предположим, что дополнительные заголовочные файлы:

c:\work\feature1\foo.h
c:\work\feature2\bar.h
  • Подход должен включать в #include указывает только имя файла, например:

    #include "foo.h"
    #include "bar.h"

    Затем путь включения, передаваемый компилятору, содержит папки, в которых существуют файлы заголовков:

    cc -Ic:\work\feature1 -Ic:\work\feature2     ...
  • Другой подход заключается в использовании относительных путей в #include операторы и предоставляют папку привязки для этих относительных путей, используя путь включения, например:

    #include "feature1\foo.h"
    #include "feature2\bar.h"

Затем укажите папку привязки (например, \work) компилятору:

 cc -Ic:\work   ...

Избегайте этих зависимостей папок

При использовании процесса построения избегайте зависимостей от папок в папке создания кода процесса построения, например model_ert_rtw папки или slprj папка. Не использовать пути в #include инструкции, относящиеся к расположению созданного исходного файла. Например, если папка создания кода MATLAB c:\work, процесс построения генерирует model.c исходный файл во вложенную папку, например:

c:\work\model_ert_rtw\model.c

model.c файл имеет #include выписки формы:

#include "..\feature1\foo.h"
#include "..\feature2\bar.h"

Предпочтительно использовать один из других предложенных подходов, поскольку относительный путь создает зависимость от структуры папки генератора кода.

Связанные темы