В этом примере показано, как интегрировать два разных созданных проекта кода C++ в один более крупный проект.
Созданные проекты кода могут иметь схожие имена функций, но другие настройки, параметры или функциональные возможности. Создание кода с пространствами имен для интеграции различных проектов с одинаковыми именами. Пространства имен также могут улучшить удобочитаемость кода.
Рассмотрим простую функцию MATLAB, которая возвращает гравитационную постоянную. Значение гравитационной константы выводится из глобальной переменной.
type getGravityConst.mfunction 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
В общем случае различные проекты интегрируются путем записи или изменения основного файла для вызова функций каждого из проектов. Используя пространства имен, можно различать созданные функции для каждого проекта, даже если имена функций одинаковы.
Пример записи основного файла, использующего созданный код C++ для обоих проектов, см. в прикрепленном файле main_planetSim.cpp. Чтобы создать исполняемый файл или двоичный файл из основного файла, необходимо указать или предоставить следующие средства сборки (компилятор, компоновщик и/или IDE) и их правильные пути:
Заголовочные файлы для любых вызываемых функций.
На платформах Windows импортируйте библиотеки (.lib файлы).
Динамические библиотеки (.dll, .so и .dylib файлы).
Включить каталоги для других созданных источников и включить файлы.
.zip файлы, которые packNGo команда, создаваемая при создании кода, содержит сгенерированные файлы кода. Распакуйте zip-файлы в папки каталога сборки или среды сборки. Необходимо также сделать динамические библиотеки доступными для исполняемого файла, например, переместив созданные динамические библиотеки в ту же папку, что и исполняемый файл.
В качестве альтернативы написанию основного файла вручную можно также интегрировать два проекта в третий созданный проект кода с помощью coder.ceval функция. coder.ceval функция позволяет вызывать внешний код C/C + + из сгенерированного кода C/C + +.
Файл planetSim.m показывает, как использовать coder.ceval и связанные функции конфигурации построения для интеграции созданных проектов в более крупный проект.
< include > planetSim.m </include >
Создание кода 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