Этот пример показов, как интегрировать два разных сгенерированных Кодов С++ проекта в один, больший проект.
Ваши сгенерированные коды могут иметь одинаковые имена функции, но имеют другие настройки, параметры или функциональность. Сгенерируйте код с пространствами имен, чтобы помочь в интеграции различных проектов, которые имеют одинаковые имена. Пространства имен также могут улучшить читаемость кода.
Рассмотрим простую функцию MATLAB, которая возвращает ускорение свободного падения. Значение ускорения свободного падения определяется из глобальной переменной.
type getGravityConst.m
function c = getGravityConst %#codegen global g c = g;
Предположим, что вы хотите сгенерировать код для getGravityConst
который моделирует сценарии для Луны и для Земли. Сгенерируйте два отдельных проекта кода с одной и той же функцией точки входа. Задайте разное глобальное значение, и, следовательно, ускорение свободного падения, для каждого проекта.
Создайте объект строения генерации кода. Задайте:
Тип сборки DLL.
Целевой язык C++.
Имя орбитального тела как пространства имен.
#pragma once
стиль #include
охрана.
Упаковка файлов сгенерированного кода в .zip
файл путем вызова packNGo
функция.
cfg = coder.config('dll'); cfg.TargetLang = "C++"; cfg.CppNamespace = 'moon'; cfg.HeaderGuardStyle = "UsePragmaOnce"; cfg.PostCodeGenCommand = 'packNGo(buildInfo)';
Сгенерируйте код для getGravityConst
для моделирования Луны:
При помощи ранее определенного объекта строения.
С отчетом генерации кода.
Такой, что код возвращает значение Луны ускорения свободного падения в единицах m/s ^ 2.
В выход папке с именем projectMoon
.
С выходными двоичными файлами, называемыми getGravityConstMoon
.
codegen getGravityConst -config cfg -report -globals {'g', -1.62} ... -d projectMoon -o getGravityConstMoon
Code generation successful: To view the report, open('projectMoon/html/report.mldatx').
Чтобы сгенерировать код для getGravityConst
который моделирует Землю, сначала измените:
Имя пространства имен
Ускорение свободного падения
Выход файла
Выход папки
cfg = coder.config('dll'); cfg.TargetLang = "C++"; cfg.CppNamespace = 'earth'; cfg.HeaderGuardStyle = "UsePragmaOnce"; cfg.PostCodeGenCommand = 'packNGo(buildInfo)'; codegen getGravityConst -config cfg -report -globals {'g', -9.81} ... -d projectEarth -o getGravityConstEarth
Code generation successful: To view the report, open('projectEarth/html/report.mldatx').
Предположим, что вы хотите спроектировать большой проект, который выполняет планетарное моделирование и вычисляет такие величины, как время рейса падающих объектов. Время рейса зависит от ускорения свободного падения для каждой планеты и начальной высоты объекта. Вы хотите использовать функции сгенерированного кода для getGravityConst
в этом крупном проекте.
Сгенерированные динамические библиотеки имеют различные расширения на других платформах. Этот код определяет правильные расширения для вашей платформы.
dllext = ''; libext = ''; if ismac dllext = '.dylib'; libext = dllext; elseif isunix dllext = '.so'; libext = dllext; elseif ispc dllext = '.dll'; libext = '.lib'; else disp('Platform not supported') return end
В общем случае вы интегрируете различные проекты, записывая или изменяя основной файл, чтобы вызвать функцию каждого из проектов. При помощи пространств имен можно различить сгенерированные функции для каждого проекта, даже если имена функции одинаковы.
Пример того, как записать основной файл, который использует сгенерированный код С++ для обоих проектов, см. в вложенном файле main_planetSim.cpp
. Чтобы создать исполняемый или двоичный файл из основного файла, вы должны задать или предоставить следующие инструментов построения (компилятор, linker и/или IDE) и их правильные пути:
Заголовочные файлы для любых вызываемых функций.
На платформах Windows импортируйте библиотеки (.lib
файлы).
Динамические библиотеки (.dll
, .so
и .dylib
файлы).
Включите директории для другого сгенерированного исходного кода и включите файлы.
The .zip
файлы, которые packNGo
команда создает во время генерации кода, содержит файлы сгенерированного кода. Распакуйте zip- файлов в папки в директорию сборки или окружения сборки. Вы также должны сделать свои динамические библиотеки доступными для исполняемого файла, например, путем перемещения сгенерированных динамических библиотек в ту же папку, что и исполняемый файл.
В качестве альтернативы записи основного файла вручную можно также интегрировать два проекта в третий сгенерированный код с помощью coder.ceval
функция. The coder.ceval
функция позволяет вам вызвать внешний код C/C + + из сгенерированного кода C/C + +.
Файл planetSim.m
показывает, как использовать coder.ceval
и связанные функции строения сборки для интеграции сгенерированных проектов в больший проект.
< включить > planetSim.m </включить >
Сгенерируйте код MEX для planetSim
функция:
linkObjectMoon = ['projectMoon/getGravityConstMoon' libext]; linkObjectEarth = ['projectEarth/getGravityConstEarth' libext]; cfg = coder.config('mex'); cfg.TargetLang = "C++"; codegen('planetSim','-config',cfg,'-d','planetSim','-report',linkObjectMoon,linkObjectEarth)
Code generation successful: To view the report, open('planetSim/html/report.mldatx').
Используйте MEX-функцию, чтобы протестировать сгенерированный код в среде MATLAB. MEX-функция должна иметь доступ к сгенерированным библиотекам ссылок. Переместите библиотеки ссылок в текущую директорию и вызовите MEX-функцию.
copyfile(['projectMoon/getGravityConstMoon' dllext]); copyfile(['projectEarth/getGravityConstEarth' dllext]); [t_m, t_e] = planetSim_mex
t_m = 3.5136
t_e = 1.4278
На выход показан рейс время падения объекта на Луне и на Земле.
codegen
| coder.ceval
| coder.cinclude
| coder.CodeConfig
| coder.config
| packNGo