主要内容

在另一个开发环境中编译代码

此示例说明如何转移生成代码并在另一个开发环境中编译它。使用 packNGo 创建一个 ZIP 文件,其中包含生成的源代码、编译信息和 CMake 配置文件。在您的目标开发环境中,使用 codebuild 函数来编译最终的库或可执行文件。

配置模型

打开模型。

CodeBuildModel

不要自动编译代码、生成联编文件或打包生成代码和工件。

set_param('CodeBuildModel', 'GenerateMakefile', 'off');
set_param('CodeBuildModel', 'PackageGeneratedCodeAndArtifacts', 'off');

生成代码和 CMake 配置文件

运行代码生成命令。

slbuild('CodeBuildModel');
### Starting serial model reference code generation build.
### Model reference code generation target for CodeBuildRefModel is up to date.
### Starting build procedure for: CodeBuildModel
### Generated code for 'CodeBuildModel' is up to date because no structural, parameter or code replacement library changes were found.
### Successful completion of code generation for: CodeBuildModel

Build Summary

0 of 2 models built (2 models already up to date)
Build duration: 0h 0m 5.7486s

生成 CMakeLists.txt 配置文件。

buildFolder = RTW.getBuildDir('CodeBuildModel').BuildDirectory;
codebuild(buildFolder, 'BuildMethod', 'cmake');

打包生成代码和 CMake 配置文件

运行 packNGo,从而按层次结构打包文件。

packNGo(buildFolder, 'packType', 'hierarchical', 'nestedZipFiles', false);

切换到另一个开发环境

这是可选步骤。例如,如果您的当前开发环境是 Linux 计算机,您可以将 zip 文件复制到 Windows 计算机,然后在该计算机上执行后续步骤。

解压缩源代码和编译信息文件

解压缩文件。

CodeBuildModel_files = unzip('CodeBuildModel.zip');

识别包含顶部组件的解压缩代码的文件夹。

CodeBuildModel_top_component_folder = fileparts(CodeBuildModel_files{1});

使用默认工具链编译可执行文件

识别默认工具链(基于 mex -setup 选择的编译器)。

defaultToolchain = coder.make.getDefaultToolchain;

编译可执行文件。

codebuild(CodeBuildModel_top_component_folder, 'BuildMethod', defaultToolchain);

检查是否生成了可执行文件。

dir(fullfile(CodeBuildModel_top_component_folder, '..', 'CodeBuildModel*'))
CodeBuildModel.exe      CodeBuildModel_grt_rtw  

使用默认模板联编文件编译可执行文件

为当前平台选择一个模板联编文件。

if ispc
    % With ert_vcx64.tmf, you must have Microsoft Visual C++ installed.
    templateMakefile = 'ert_vcx64.tmf';
else
    templateMakefile = 'ert_unix.tmf';
end

编译可执行文件。

codebuild(CodeBuildModel_top_component_folder, 'BuildMethod', templateMakefile);

编译共享库

在 Windows 上,创建一个定义文件,它指定导出的符号。

if ispc
    exportsFile = fullfile...
        (CodeBuildModel_top_component_folder, 'CodeBuildModel.def');
    fid = fopen(exportsFile, 'w');
    fwrite(fid, ['EXPORTS' newline]);
    fwrite(fid, ['CodeBuildModel_initialize' newline]);
    fwrite(fid, ['CodeBuildModel_step' newline]);
    fwrite(fid, ['CodeBuildModel_terminate' newline]);
    fclose(fid);
end

编译共享库。

codebuild(CodeBuildModel_top_component_folder, 'BuildVariant', 'SHARED_LIBRARY');

构建静态库

codebuild(CodeBuildModel_top_component_folder, 'BuildVariant', 'STATIC_LIBRARY');

使用 CMake 配置文件

通过 CMakeLists.txt 文件,您可以使用第三方工具 CMake 为您选择的编译器环境生成联编文件或工作区。

计算当前平台的 CMake 命令。

if ispc
    cmakeCommand = fullfile(matlabroot, 'bin', computer('arch'), 'cmake', 'bin', 'cmake.exe');
else
    cmakeCommand = fullfile(matlabroot, 'bin', computer('arch'), 'cmake', 'bin', 'cmake');
end

使用 CMake,编译可执行文件。

cd(CodeBuildModel_top_component_folder)
[status1, cmdout1] = system([cmakeCommand ' .']);
[status2, cmdout2] = system([cmakeCommand ' --build .']);

另请参阅

|

主题