打印
[嵌入式linux]

迅为IMX6ULL开发板Ubuntu下C编程入门(二)

[复制链接]
327|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本文是介绍3.3 初识 Makefile+3.4Makefile语法
3.3  初识  Makefile
3.3.1  什么是 Makefile
3.2 章节我们了解了在 Ubuntu 系统下通过 gcc 编译器来编译 C 程序,在我们演示的历程中只有一个C 文件,我们直接在终端输入 gcc 的编译命令,就完成了 C 程序的编译。我们在实际开发过程中,如果我们的工程有几十个,或者几百几千个 C 文件,我们通过在终端输入 gcc 命令来编译,这显然是不现实的。为了解决这个问题我们可以使用“make”命令,它会解析 Makefile 文件中的指令(应该说是规则)来编译整个工程。在 Makefile 文件中描述了整个工程的所有文件的编译顺序,编译规则。
作为一个专业的程序员,一定要掌握 Makefile 的,我们可以通过 Makefile 能了解到整个工程的处理过程的。
由于Makefile涉及到很多的知识点,以至于可以单独写本书来讲述,所以本章我们只是讲解下Makefile的基础入门,如果详细的研究 Makefile,可以给大家推荐《跟我一起写 Makefile》这个电子文档,该文档已经放在了:i.MX6UL 终结者光盘资料\09_其它参考资料里面了。
3.3.2  第一个 Makefile在本节我们建立这样一个工程,计算两个整形数的和,并将结果在终端显示出来。在这个工程中一共有main.ccalc.c 两个 C 文件和 calc.h 这个头文件。其中 main.c 是主文件,calc.c 负责接收 main.c 传过来的数据,然后进行相加。main.c 文件的内用如下:
#include <stdio.h>
include "calc.h"
int main(int argc, char *argv[])
{
int a = 3, b = 6, sum;
sum = calc(a, b);
printf("%d + %d = %d\n", a, b, sum);
return 0;
}
calc.c 文件内容如下:
#include <calc.h>
int calc(int a, ing b)
{
return (a+b);
}
文件 calc.h 内容如下:
#ifndef _CALC_H
#define _CALC_H
int calc(int a, int b);
#endif
上面就是我们这个工程的所有源文件,我们在终端使用 gcc 编译这个工程,在终端输入“gcc main.ccalc.c -o main”,该命令的意思是用 gcc main.ccalc.c 进行编译,然后输出可执行文件 main,运行结果如下图所示:
通过上图可以看到生成了可执行文件 main,我们在终端运行 main 执行文件,运行结果如下图所示:
我们可以看到上图的运行结果和我们设计的结果是一致的。由于我们的这个工程是有三个文件,如果工程有几百个,几千个的文件,或者如果有一个文件被修改,使用上面的命令将会编译所有的文件,如果我们的工程有上万个文件,编译完一次工程所需要的时间就很可怕。最优的方法就是编译过一次以后,如果后面在编译,只编译修改的文件,这样就会节约很多时间,因此我们修改下编译方法,命令如下:
gcc -c main.c
gcc -c calc.c
gcc main.o calc.o -o main
我们在终端输入上面的命令,结果如下图所示:
上图的第一条和第二条命令里面使用了参数“-c”是把 main.c 和 calc.c 编译成对应的.o 文件,最后一条命令是把编译生成的.o 文件链接成可执行文件 main。假如我们修改了 main.c 这个文件。只需将 main.c这个一个文件重新编译下,然后在把所有的.o 文件重新链接成可执行文件,对应的命令如下:
gcc -c main.c
gcc main.o calc.o -o main
可是这样还有一个问题,如果需要修改的文件有很多,这样工作量也会不小,所以我们需要一个工具:
1.如果工程没有编译过,就会把工程中的.c 文件全部编译并连接成可执行文件
2.如果工程中有某些文件修改了,只编译修改的文件并连接成可执行文件
3.如果工程中的头文件修改了,那么就要编译所有引用这个头文件的.c 文件,并且连 接成可执行文件
我们开头说的 Makefile 就是完成这个功能的,下面我们在工程中建立一个 Makefile 文件来实现这样的功能(注意:文件名字必须为 Makefile,大小写是区分的)。我们使用 vim 创建 Makefile 文件(Makefile和我们的 main.ccalc.c 在同一级目录下),然后输入下面的脚本:
mainmain.o calc.o
gcc -o main main.o calc.o
main.omain.c
gcc -c main.c
calc.ocalc.c
gcc -c calc.c
clean
rm -rf *.o
rm -rf main
上面脚本缩进的行需要使用Tab”键缩进,不要使用空格,这是 Makefile 的语法要求,编写完成的脚本如下图所示:
编写好 Makefile,保存并退出,然后我们在终端输入“make”命令来编译我们的工程,make 命令会在当前目录下查找“Makefile”文件,如果存在的话就按照 Makefile 里面的规则进行编译,如下图所示:
通过上图可以看到编译产生了 main.ocalc.o main 执行文件,说明编译成功了。接下来我们修改下 main.c 这个文件,如下图所示:
然后保存并退出,然后在终端输入“make”再次编译下工程,如下图所示:
通过上图我们可以看到只重新编译了修改的 main.c,并最终重新链接生成可执行文件 main,我们在终端运行可执行文件 main,如下图所示:


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

634

主题

714

帖子

1

粉丝