嵌入式技术及应用-【Ubuntu】实验3-Makefile实验

一、实验目的及要求

1、了解Makefile的基本概念和基本结构

2、初步掌握编写简单Makefile的方法

3、了解递归Make的编译过程

4、初步掌握利用GNU Make编译应用程序的方法

二、实验原理与内容

       在Linux或Unix环境下,对于只含有几个源代码文件的小程序(如hello.c)的编译,可以手工键入gcc命令对源代码文件逐个进行编译;然而在大型的项目开发中,可能涉及几十到几百个源文件,采用手工键入的方式进行编译,则非常不方便,而且一旦修改了源代码,尤其头文件发生了的修改,采用手工方式进行编译和维护的工作量相当大,而且容易出错。所以在Linux或Unix环境下,人们通常利用GNU make工具来自动完成应用程序的维护和编译工作。实际上,GNU make工具通过一个称为Makefile的文件来完成对应用程序的自动维护和编译工作。Makefile是按照某种脚本语法编写的文本文件,而GNU make能够对Makefile中指令进行解释并执行编译操作。Makefile文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。GNU make工作时的执行步骤如下:

1、读入所有的Makefile。
2、读入被include的其它Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。

1-5步为第一个阶段,6-7为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么,make会把其展开在使用的位置。但make并不会完全马上展开,make使用的是拖延战术,如果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展开。

三、实验软硬件环境

虚拟机软件、一台计算机

四、实验过程(实验步骤、记录、数据、分析)

 按步骤依次写出程序、运行结果等(可截屏)

一、使用命令行的方式手动编译程序方法

1、利用文本编辑器创建hello.c文件

2、手动编译hello应用程序

在hello.c的目录的终端下输入:

$ gcc –c hello.c

$gcc hello.o –o hello

通过ls命令查看当前目录下是否生成源代码hello.c的object文件hello.o和可执行文件hello,运行可执行文件hello。查看一下运行结果。

$./hello

3、修改hello.c文件,重新手动编译应用程序。

4、删除hello.o和hello文件

$rm –f hello.o

$rm –f hello

二、利用 GNU make 自动编译应用程序方法

  1. 利用文本编辑器创建一个makefile文件,并将其保存到与hello.c相同的目录下。
  2. 先后执行如下命令

    [root@local]$make

    [root@local]$ls

    [root@local]$./hello

    查看并记录所生成的文件和运行的结果。

  3. 执行make clean命令:

    [root@local]$make clean

  4. 修改hello.c文件,重复第2、3步操作,查看并记录所生成的文件和运行结果,并与手动编译进行比较,写出你的结论。

  5. 重新编辑makefile文件(斜黑体表示修改部分)

    6、重复第2,3步操作,查看并记录所生成的文件和运行的结果。比较这两种操作,写出你的结论。同时指出$^ 、$@、$<在上述Makefile中的含义。

三、多个.c文件的编译

1、创建文件hello1.c、hello2.c、hello2.h和makefile

2、先后执行如下命令

$make

$ls

$./hello

查看并记录所生成的文件和运行的结果, 写出你的结论。

2.修改makefile文件(斜黑体表示修改部分)

3、重复第2步操作,查看并记录所生成的文件和运行的结果, 写出你的结论。并指出wildcard、.c.o的含义和变量CFILES代表的内容。

五、实验结论与体会

【思考题】

1.根据提供的Linux操作系统源码中得Makefile结构,分析在工程中多级目录中存在着多个makefile时,编译的顺序如何?

解:

在Linux操作系统源码中,Makefile的结构通常采用嵌套的方式,以支持多级目录下的文件编译。嵌套的Makefile会根据目标文件的依赖关系和目录结构来确定编译的顺序

当存在多个Makefile时,编译的顺序通常如下:

1.顶层Makefile:这是整个工程的最顶层Makefile,它通常定义了编译规则和目标文件,并指定需要编译的子目录和目标文件。它会包含其他各级目录下的Makefil

2.子目录Makefile: 在每个子目录中,通常都有一个对应的Makefile。这些Makefile会定义该目录下的源文件的编译规则和依赖关系,并包含下一级子目录的Makefile

3.递归编译:当顶层Makefile执行时,它会依次包含各级子目录的Makefile。这些Makefile会根据它们的规则和依赖关系递归地编译源文件,直到最底层目录

4.目标文件生成:在每个目录的Makefile中,都会定义生成目标文件的目标规则这些规则通常会依赖于该目录下的源文件和其他依赖文件。当所有依赖文件都已编译完成后,目标规则会生成最终的目标文件。

总体来说,编译的顺序是从顶层Makefile开始,依次包含各级子目录的Makefile,并按照依赖关系递归地编译源文件,直到最底层目录。最终生成目标文件。这样的结构可以方便地管理大型项目的编译过程,确保源代码的正确性和可维护性。

2.根据Makefile中变量定义规则,如果实验中的hello.c文件编译到目标平台中运行,应该怎样修改Makefile中变量参数?

解:

在Makefile中,通常会定义一些变量来存储编译选项和编译目标。为了将hello.c文件编译到目标平台中运行,需要根据目标平台的特性修改Makefile中的变量参数(如,CFLAGS、LDFLAGS、LIBS、INSTALL_DIR等)

①CFLAGS:这是编译C源代码的编译器选项。可能需要添加或修改某些选项,以适应目标平台的编译器特性或优化级别。

②LDFLAGS:这是链接器选项,用于指定链接过程中的参数,根据目标平台的特定需求,可能需要修改链接器选项,例如指定特定的库文件路径或链接器选项

③LIBS:这是链接过程中需要的库文件列表。根据目标平台所需的库文件,可能需要修改LIBS变量以包含正确的库文件

④INSTALL DIR:这是编译后文件的目标安装目录。根据目标平台的文件系统结构您可能需要修改INSTALL DIR变量以指定正确的安装目录

  • 16
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

利威尔·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值