主要内容

添加构建过程依赖项

当您为代码生成指定一个系统目标文件时,代码生成器可以构建一个可以在开发计算机上运行的独立可执行程序。为了构建可执行程序,代码生成器使用所选的编译器和由工具链或模板生成文件(TMF)构建过程方法生成的生成文件。生成makefile过程的一部分是为编译在生成的makefile中添加源文件、头文件和库文件信息(依赖项)。或者,对于特定的应用程序,您可以通过配置管理系统添加生成的文件和文件依赖项。

为模型生成的代码由一小组文件组成。(见管理构建过程文件)。这些文件依赖于其他文件,这是由于:

  • 头文件包含

  • 宏声明

  • 函数调用

  • 变量声明

模型或外部代码引入依赖关系的原因有很多:

  • 模型中的块生成进行函数调用的代码。这些调用可以以几种形式出现:

    • 包含的源文件(未生成)声明被调用的函数。在诸如块集的情况下,通过将这些源文件依赖项编译到库文件中来管理它们。

    • 生成的代码调用编译器提供的运行时库中的函数。

    • 一些函数依赖关系也是生成的文件,这些文件称为共享实用程序。一些例子是定点实用程序和非有限支持函数。金宝app这些依赖关系被称为共享实用程序。生成的函数可以出现在独立模型的构建文件夹中的文件中,也可以出现在_sharedutils文件夹slprj包含模型引用的构建的文件夹。

  • 具有连续时间的模型需要求解器源代码文件。

  • 代码生成器选项,如外部模式、C API和mat文件日志记录。

  • 外部代码指定依赖关系。

生成过程的文件依赖项信息

代码生成器提供了几种机制来将文件依赖项信息输入到构建过程中。这些机制取决于您的依赖项是基于块的,还是基于模型或系统目标文件的。

对于块依赖,考虑使用:

对于基于模型或系统目标文件的依赖项,例如外部头文件,可以考虑使用:

生成的Makefile依赖项

对于工具链方法或模板生成文件(TMF)方法构建过程,代码生成器生成一个生成文件。对于tmf,生成的makefile提供令牌扩展,构建过程在其中扩展makefile中的不同令牌,以包括额外的依赖项信息。生成的makefile包含完整的依赖项信息。看到自定义模板生成文件

生成的makefile包含:

  • 源文件依赖项的名称

  • 源文件所在的文件夹

  • 头文件的位置

  • 预编译的库依赖项

  • 图书馆使实用程序编译和创建

的性质使实用程序的一个特点是,您不必为给定的源C或c++文件指定特定的位置。如果存在针对该文件夹的规则,并且源文件名是makefile中的先决条件,则make实用程序可以找到源文件并编译它。C或c++编译器(预处理器)不需要头文件的绝对路径。类来查找带有头文件名称的头文件# include指令和包含路径。生成的C或c++源代码依赖于这个标准编译器功能。

库是根据库创建和链接的,但会阻塞程序调用的特定函数。

这些属性会使手动确定文件依赖项的最小列表变得困难。您可以使用makefile作为起点来确定生成代码中的依赖关系。

确定依赖关系的另一种方法是使用链接器信息(例如链接器映射文件)来确定符号依赖关系。映射文件提供了代码生成器和块集源文件以及头文件的位置,以帮助定位依赖项。

代码生成器静态文件依赖项

MATLAB中的几个位置®文件夹树包含特定于代码生成器的静态文件依赖项:

  • matlabroot/ rtw / c / src开放

    此文件夹包含子文件夹,并包含必须编译的其他文件。示例包括求解器函数(用于连续时间支持)、外部模式支持文件、C API支持文件和s函数支持文件。金宝app将此文件夹中的源文件包含到生成过程中SRCmakefile的变量。

  • 文件夹中的头文件matlabroot / rtw走读生/包括

  • 文件夹中的头文件matlabroot 金宝app/模型/包括

    这些文件夹包含额外的头文件依赖项,例如tmwtypes.hsimstruc_types.h,simstruc.h

    请注意

    对于基于ert的系统目标文件,可以避免若干头依赖项。基于ert的系统目标文件在文件中生成类型定义、宏等的最小集合rtwtypes.h

块集静态文件依赖项

Blockset产下载188bet金宝搏品具有s函数代码应用rtwmakecfg.m为代码生成器提供依赖项信息的机制。的rtwmakecfg.m来自该块集的文件包含该块集的包含路径和源路径依赖项的列表。通常,块集从生成的模型代码可以链接到的源文件创建一个库。类时创建和标识库rtwmakecfg.m机制。

要定位rtwmakecfg.m在你的MATLAB安装树中,使用以下命令:

>>其中-all rtwmakecfg.m

属性所列出的一个或多个块集哪一个命令时,可以从各自的rtwmakecfg.m文件。

生成过程的文件夹依赖项信息

你可以添加# include语句生成的代码。这样的引用可以来自多个来源,包括用于内联s函数的TLC脚本、自定义存储类、总线对象和数据类型对象。所包含的文件由用于外部代码或其他自定义的头文件组成。属性指定编译器包含路径-我编译器选项。构建过程使用指定的路径搜索包含的头文件。

生成代码的使用场景包括但不限于以下:

  • 自定义构建过程编译生成的代码,这些代码需要一组特定于环境的# include语句。

    在此场景中,当您选择模型配置参数时,构建过程将调用代码生成器只生成代码.方法中使用完全限定路径、相对路径或仅使用头文件名# include语句。使用include路径。

  • 构建过程编译生成的代码。

    在这种情况下,您可以指定编译器包含路径(-我),以以下几种方式进行构建:

    • 上指定其他包含路径代码生成>自定义代码窗格中的配置参数。代码生成器将包含路径传播到生成的makefile中。

    • rtwmakecfg.m机制允许s -函数在构建过程中引入额外的包含路径。代码生成器将包含路径传播到生成的makefile中。

    • 在构建使用自定义系统目标文件并基于makefile的模型时,可以直接将包含路径添加到系统目标文件使用的模板makefile中。

    • 使用使命令指定USER_INCLUDESMake变量,该变量定义构建过程在其中搜索包含的文件的文件夹。例如:

      make_rtw USER_INCLUDES = id: \ \ feature1工作

      构建过程将自定义包含传递给make实用程序的命令行调用,后者将它们添加到传递给编译器的总体标志中。

使用# include语句和包含路径

考虑以下使用方法# include语句,并包含构建过程的路径,以生成可移植的代码,并最大限度地减少与未来版本的兼容性问题。

假设额外的头文件是:

c: \ \ feature1 \工作foo c: \ \ feature2 \ bar.h工作
  • 一种方法是在# include语句只包含文件名,例如:

    #include "foo.h"

    然后,传递给编译器的include路径包含存在头文件的文件夹:

    -Ic:\work\feature2…
  • 另一种方法是使用相对路径# include语句,并使用include路径为这些相对路径提供一个锚文件夹,例如:

    #include "feature2\bar.h"

然后,指定锚文件夹(例如\工作)交给编译器:

cc -Ic:\work…

避免这些文件夹依赖

使用构建过程时,避免依赖于构建过程中的文件夹代码生成文件夹,例如模型_ert_rtw文件夹或slprj文件夹中。不使用路径# include相对于生成的源文件位置的语句。例如,如果您的MATLAB代码生成文件夹是c: \工作时,构建过程生成模型.c源文件到子文件夹,如:

c: \ \ model_ert_rtw \ model.c工作

模型.c文件# include陈述形式:

#include“..\feature2\bar.h”

最好使用其他建议的方法之一,因为相对路径创建了对代码生成器文件夹结构的依赖关系。

相关的话题