В этом примере показано, как интегрировать два различных сгенерированных проекта Кода С++ в один, больший проект.
Ваши проекты сгенерированного кода могут иметь подобные имена функций, но иметь различные настройки, параметры или функциональность. Сгенерируйте код с пространствами имен, чтобы помочь в интеграции различных проектов, которые совместно используют те же имена. Пространства имен могут также улучшить удобочитаемость кода.
Рассмотрите простую функцию MATLAB, которая возвращает гравитационную константу. Значение гравитационной константы получено на глобальную переменную.
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
смоделировать Луну:
При помощи ранее заданного объекта настройки.
С отчетом генерации кода.
Таким образом, что код возвращает значение Луны гравитационной константы в модулях м/с^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
. Чтобы создать исполняемый файл или двоичный файл из основного файла, необходимо задать или предоставить следующее инструментам сборки (компилятор, компоновщик и/или IDE) и их правильные пути:
Заголовочные файлы для любых вызванных функций.
На платформах Windows, библиотеки импорта (.lib
файлы).
Динамические библиотеки (.dll
, .so
и .dylib
файлы).
Включайте директории для другого сгенерированного источника и включайте файлы.
.zip
файлы, что packNGo
команда создает во время генерации кода, содержат файлы сгенерированного кода. Распакуйте zip-файлы к папкам в вашем каталоге сборки или среде сборки. Необходимо также сделать динамические библиотеки доступными для исполняемого файла, например, путем перемещения сгенерированных динамических библиотек в ту же папку как исполняемый файл.
Как альтернатива записыванию основного файла вручную, можно также интегрировать два проекта в третий проект сгенерированного кода при помощи coder.ceval
функция. coder.ceval
функция позволяет вам вызвать внешний код C/C++ из сгенерированного кода C/C++.
Файл planetSim.m
показывает, как использовать coder.ceval
и сопоставленная конфигурация сборки функционирует, чтобы интегрировать сгенерированные проекты в больший проект.
function [t_m, t_e] = planetSim %#codegen % Example function that integrates generated code projects with namespaces d = 10; g = 0; % Add #include statements for external function names coder.cinclude('../projectMoon/getGravityConst.h'); coder.cinclude('../projectEarth/getGravityConst.h'); % Call external functions & do computations g = coder.ceval('moon::getGravityConst'); t_m = timeToDrop(d,g); g = coder.ceval('earth::getGravityConst'); t_e = timeToDrop(d,g); function t = timeToDrop(d,g) t = sqrt(2*d/(-g));
Сгенерируйте код 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.CodeConfig
| coder.ceval
| coder.cinclude
| coder.config
| packNGo