Добавьте зависимости от процесса сборки

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

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

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

  • Макро-объявления

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

  • Объявления переменной

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

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

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

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

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

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

  • Опции генератора кода, такие как режим external mode, C API и логгирование MAT-файла.

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

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

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

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

  • S-функции и blocksets

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

    • Создайте правила make-файла для этих папок, чтобы допускать нахождение исходного кода.

    • Задайте дополнительные имена исходного файла параметром Блока s-function SFunctionModules.

    • Задайте дополнительные зависимости с rtwmakecfg.m механизм. Смотрите Использование rtwmakecfg.m API, чтобы Настроить Сгенерированные Make-файлы (Simulink Coder).

    Для получения дополнительной информации о применении этих подходов к устаревшей или внешней интеграции кода смотрите Вызовы Импорта Внешнего Кода в Сгенерированный код с Legacy Code Tool (Simulink Coder).

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

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

  • Code Generation> панель Custom Code в диалоговом окне Configuration Parameters. Можно задать дополнительные библиотеки, исходные файлы, и включать папки.

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

Сгенерированные зависимости от make-файла

Для подхода набора инструментальных средств или make-файла шаблона (TMF) приближаются к процессам сборки, генератор кода генерирует make-файл. Для TMFs сгенерированный make-файл обеспечивает маркерное расширение, в которое процесс сборки расширяет различные лексемы в make-файле, чтобы включать дополнительную информацию о зависимостях. Получившийся make-файл содержит полную информацию о зависимостях. Смотрите Настраивают Make-файлы Шаблона (Simulink Coder).

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

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

  • Папки, где исходные файлы расположены

  • Местоположение заголовочных файлов

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

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

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

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

Эти свойства могут мешать определять минимальный список зависимостей от файла вручную. Можно использовать make-файл в качестве начальной точки, чтобы определить зависимости в сгенерированном коде. Для примера, который показывает, как идентифицировать зависимости, смотрите, Перемещают Код к Другой Среде разработки с packNGo (Simulink Coder).

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

Генератор кода статические зависимости от файла

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

  • matlabroot/rtw/c/src открытый

    Эта папка имеет подпапки и содержит дополнительные файлы, должен быть скомпилирован. Примеры включают функции решателя (для непрерывной поддержки времени), файлы поддержки режима external mode, 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 файл от blockset содержит список, включают путь и исходные зависимости от пути для blockset. Как правило, blocksets создают библиотеку от исходных файлов, до которых может соединиться сгенерированный типовой кодекс. Библиотеки созданы и идентифицированы, когда вы используете rtwmakecfg.m механизм.

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

>> which -all rtwmakecfg.m

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

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

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

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

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

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

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

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

    • Задайте дополнительный, включают пути на Code Generation> панель Custom Code в диалоговом окне Configuration Parameters. Генератор кода распространяет включать пути в сгенерированный make-файл.

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

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

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

      make_rtw USER_INCLUDES=-Id:\work\feature1

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

Используйте #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   ...

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

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

c:\work\model_ert_rtw\model.c

modelC файл имеет #include операторы формы:

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

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

Похожие темы