Для процесса построения требуется поддерживаемый компилятор. В этом контексте компилятор относится к среде разработки, содержащей компоновщик и утилиту make, а также компилятор языка высокого уровня. Дополнительные сведения о поддерживаемых версиях компилятора см. в разделе:
При создании исполняемой программы процесс сборки должен иметь доступ к поддерживаемому компилятору. Процесс построения может найти компилятор для использования на основе компилятора MEX по умолчанию.
Процесс построения также требует выбора последовательности инструментов или файла макета шаблона. Файл makefile цепочки инструментов или шаблона определяет, какой компилятор запускается на этапе создания сборки. Дополнительные сведения см. в разделах Выбор подхода к построению и настройка процесса построения.
Сведения о том, какие шаблоны makefile доступны для компилятора и целевого файла системы, см. в разделе Сравнение поддержки целевых файлов системы по продуктам.
Как для созданных файлов, так и для файлов, предоставленных пользователем, расширение файла, .c или .cppопределяет, использует ли процесс построения компилятор C или C++. Если расширение файла .cпроцесс построения использует компилятор C для компиляции файла, а символы используют соглашение о связях C. Если расширение файла .cppпроцесс построения использует компилятор C++ для компиляции файла, а символы используют спецификацию связи C++.
Генератор кода создает код, соответствующий следующим стандартам:
| Язык | Поддерживаемый стандарт |
|---|---|
| C | ISO ®/IEC 9899:1990, также известный как C89/C90 |
| C++ | ISO/IEC 14882:2003 |
Код, создаваемый генератором кода из этих источников, соответствует стандарту ANSI ® C/C + +:
Встроенный блочный алгоритмический код Simulink ®
Сгенерированный код системного уровня (проверка идентификатора задачи [TID], управление, функции и т.д.)
Код из других блоков, включая продукт Fixed-Point Designer™ и продукт Communications Toolbox™
Код других генераторов кода, таких как функции MATLAB ®
Кроме того, генератор кода может включать код из:
Целевые файлы встроенной системы (например, код запуска, блоки драйверов устройств)
Пользовательские S-функции или файлы TLC
Примечание
Стандарты кодирования для этих двух источников не контролируются генератором кода. Эти стандарты могут быть источником проблем соответствия, таких как код, в котором используются C99 функции, не поддерживаемые в поднаборе C89/C90 ANSI C.
Генератор кода создает код C и C++. При выборе языка программирования необходимо учитывать следующее:
Требуется ли в проекте настройка генератора кода для использования определенного компилятора? Для создания кода C/C + + в Windows ® требуется этот выбор.
Требуется ли в проекте изменение настройки языка по умолчанию для модели? См. раздел Выбор языка программирования C или C++.
Требуется ли в проекте интеграция устаревшего или пользовательского кода с созданным кодом? Обзор параметров интеграции см. в разделе Что такое интеграция внешнего кода?.
Требует ли ваш проект интеграции кода C и C++? Если да, см. раздел Что такое интеграция внешнего кода?.
Примечание
Код C и C++ можно смешивать при интеграции сгенерированного кода с пользовательским кодом. Однако необходимо иметь в виду различия между соглашениями о связях C и C++ по умолчанию и добавить extern "C"«спецификатор связи, когда это необходимо». Подробные сведения о различных конвенциях о связях и порядке их применения extern "C", см. справочник по языку программирования C++.
Требует ли ваш проект поддержки генерации кода от других продуктов? См. раздел Ограничения поддержки языка C++.
Примеры генерации кода C++ с помощью Stateflow ® см. в разделеsfcndemo_cppcount модель или sf_cpp модель.
Для использования поддержки языка C++ может потребоваться настроить генератор кода на использование определенного компилятора. Например, если поддерживаемый компилятор не установлен на компьютере с ОС Microsoft ® Windows, по умолчанию используется компилятор lcc Компилятор C поставлялся с продуктом MATLAB. Этот компилятор не поддерживает C++. Если генератор кода не настроен на использование компилятора C++ до указания языка C++ для создания кода, программа выдает сообщение об ошибке.
Ограничения генератора кода для поддержки C++ включают:
Генератор кода не поддерживает генерацию кода C++ для следующего:
| Simscape™ Driveline™ |
| Simscape Multibody™ Первое поколение (поддерживается Simscape Multibody второго поколения) |
| Системы питания Simscape Electrical™ |
| Симулинк Real-Time™ |
Для целевых файлов системы на основе ERT и ERT, для упаковки интерфейса кода установлено значение Nonreusable function, следующие поля в настоящее время не поддерживают .cpp расширение.
Имя файла определения данных
Файл определения для объекта данных, который является объектом Simulink.Signal или Simulink.Parameter классы или их подклассы.
При указании имени файла с помощью .c расширение или без расширения и укажите C++ для языка генерации кода, генератор кода создает .cpp файл.
Генератор кода уменьшает использование памяти и усиливает выполнение сгенерированного кода, предполагая, что операции со знаком целого числа C переносятся при переполнении. Переполнение целого числа со знаком происходит, когда результат арифметической операции выходит за пределы диапазона значений, которые может представлять тип выходных данных. Язык программирования C не определяет результаты таких операций. Некоторые компиляторы C агрессивно оптимизируют подписанные операции для значений в диапазоне за счет условий переполнения. Другие компиляторы сохраняют полное поведение wrap-on-overflow. Например, компиляторы gcc и MinGW предоставляют возможность надежно переносить переполнение для подписанных целочисленных переполнений. Созданный образ программы для модели может давать результаты, отличающиеся от результатов моделирования модели, поскольку обработка переполнений зависит от компилятора.
При создании кода, если используется поддерживаемый компилятор с параметрами по умолчанию, настроенными генератором кода, компилятор сохраняет полное поведение wrap-on-overflow. Если изменить параметры компилятора или скомпилировать код в другой среде разработки, возможно, компилятор не сохранит полное поведение wrap-on-overflow. В этом случае исполняемая программа может давать непредсказуемые результаты.
Если эта проблема связана с вашим приложением, рассмотрите одно или несколько из следующих действий:
Убедитесь, что скомпилированный код дает ожидаемые результаты.
Если компилятор может принудительно выполнять перенос, включите его. Например, для компилятора gcc или компилятора на основе gcc, например MinGW, настройте процесс сборки для использования параметра компилятора. -fwrapv.
Выберите компилятор, переносимый при переполнении целых чисел.
Если установлен Embedded Coder, разработайте и примените пользовательскую библиотеку замены кода для замены кода, созданного для подписанных целых чисел. Дополнительные сведения см. в разделе Настройка замены кода.
Чтобы просмотреть установленные компиляторы и выбрать компилятор по умолчанию, в окне команд введите:
mex -setup
На компьютере с ОС Windows можно установить поддерживаемые компиляторы и выбрать компилятор по умолчанию.
На платформе UNIX ® компилятором по умолчанию является GNU
®gcc/g++ для GNU или Xcode для Mac.
Если конфигурация подхода построения не выбирает определенный компилятор, генератор кода использует компилятор по умолчанию для процесса построения.
В первую очередь указанный системный целевой файл определяет компилятор, который требуется генератору кода:
Если выбран системный целевой файл на основе цепочки инструментов, например grt.tlc (Общий целевой объект в реальном времени), ert.tlc (Встроенный кодер ®), илиautosar.tlc (Embedded Coder for AUTOSAR (встроенный кодер для AUTOSAR)), на вложенной панели процесса построения отображаются параметры конфигурации для процесса построения. Используйте параметр конфигурации Toolchain, чтобы выбрать компилятор и связанные инструменты для построения модели. Чтобы проверить выбранную цепочку инструментов, нажмите кнопку «Проверить цепочку инструментов».
Если выбран системный целевой файл на основе шаблона makefile (TMF), например, rsim.tlc, в подпанели Процесс построения отображаются параметры make-файла шаблона для настройки процесса построения. Параметр Template makefile отображает файл TMF по умолчанию для выбранного целевого файла системы. Если системный целевой файл поддерживает специфичные для компилятора makefile-файлы шаблонов (например, Rapid Simulation или S-Function), можно задать для make-файла Template значение TMF-файла, специфичного для компилятора, например rsim_lcc.tmf или rsim_unix.tmf. (Для получения информации о допустимых именах TMF см. раздел Сравнение поддержки системных целевых файлов по продуктам.)
Если созданный код превышает предел статической памяти 2 Гб, возникает ошибка компилятора. Для решения этой проблемы:
Для целевых файлов системы на основе GRT установите для параметра конфигурации модели Code interface packaging значение Reusable function.
Для целевых файлов системы на основе ERT установите для параметра конфигурации модели Code interface packaging значение Reusable function и выберите параметр Использовать динамическое выделение памяти для инициализации модели.
Когда генератор кода строит модели с S-функциями, исходный код для S-функций может находиться либо в текущей папке, либо в той же папке, что и их MEX-файл. Генератор кода добавляет путь включения к созданным makefile всякий раз, когда он находит файл с именем в той же папке, что и MEX-файл S-функции. Эта папка должна находиться в пути MATLAB.sfncname.h
Аналогично, генератор кода добавляет правило для папки, когда находит файл (или sfncname.c.cpp) в той же папке, в которой находится MEX-файл S-функции.