Интегрируйте несколько сгенерированных проектов кода С++

В этом примере показано, как интегрировать два различных сгенерированных проекта Кода С++ в один, больший проект.

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

Сгенерируйте код С++ для алгоритма MATLAB

Рассмотрите простую функцию 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-файлы к папкам в вашем каталоге сборки или среде сборки. Необходимо также сделать динамические библиотеки доступными для исполняемого файла, например, путем перемещения сгенерированных динамических библиотек в ту же папку как исполняемый файл.

Запишите функцию MATLAB, которая Интегрирует эти Два Проекта

Как альтернатива записыванию основного файла вручную, можно также интегрировать два проекта в третий проект сгенерированного кода при помощи 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-функцию

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

Выход показывает время полета для падающего объекта на Луне и на Земле.

Смотрите также

| | | | |

Похожие темы