在另一个开发环境中编译代码
此示例说明如何转移生成代码并在另一个开发环境中编译它。使用 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 .']);