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

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

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

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

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

Написание функции MATLAB, которая интегрирует два проекта

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

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

На выход показан рейс время падения объекта на Луне и на Земле.

См. также

| | | | |

Похожие темы