编写makefile的一般方法
在这里通过编写一个简单的makefile实例,和大家交流学习编写makefile的方法
(1) 首先在程序员的心中必须知道源程序有几个模块构成
在此实例中源程序有3模块构成,分别是头文件 tou.h ,函数fun.c ,主函数main.c
(2) 编写程序的各个模块
1) 编写头文件
在此实例中头文件tou.h中包含了标准库库函数#include<stdio.h>
和要使用的函数的外部声明extern int add(int a,int b);
注意:以后要用到的所有库函数的头文件都写在这里,以后编写程序要添加库函数或者自定义的头文件都可以写在这里,方便省事。
2) 编写函数fun.c ,此函数实现的是两个数的加法运算
#include"tou.h"
int add(inta,int b)
{
return a + b;
}
注意:在此函数中fun.c 依赖tou.h这个头文件,弄清这个依赖关系后,为接下来编译工作的进行解决不小的麻烦
(3) 编写主函数 main.c
#include"tou.h"
int main()
{
inta=2,b=3;
a=add(a,b);
printf("%d\n",a);
return 0;
}
(4)以上三步完成了编写makefile的基础工作,这为编写makefile打下了基础
首先要理解gcc的编译流程
(1)预处理.预处理器将对源文件预处理
(2)编译.gcc将c文件编译成汇编文件,生成.S文件。
(3)汇编。将汇编语言文件汇编,生成目标文件.o文件
(4)连接。ld将目标文件和外部符号进行连接,得到一个可执行二进制文件
接下来要理解的就是makefile中的依赖关系,我们的目标是产生目标文件all,就是将文件所有的后缀名为.c文件,通过gcc编译命令,生成.o文件 ,再让所有的.O正确连接生成可执行文件。如果理解了这些我们的任务就完成了一大半。
all: main.o fun.o
gcc main.o fun.o -o all
可执行文件all 依赖由main.c和fun.c生成的main.o和fun.o文件
main.o: main.c fun.c tou.h
gcc -c main.c
main.o文件的生成又依赖main.c、fun.c和tou.h这三个文件
fun.o: tou.h
gcc -c fun.c
fun.o文件的生成又依赖tou.h这个文件
接下来的工作就是有关调试的了,如果程序的所有模块在编译额过程中出现了错误,需要清除已经产生文件就需要clean这个命令了,所以下面可以这样写
.PHONY:clean
clean:
rm-f *.o
将上述内容由上及下组合起来就组成了一个完整的makefile
all: main.o fun.o
gcc main.o fun.o -o all
main.o: main.c fun.c tou.h
gcc -c main.c
fun.o: tou.h
gcc -c fun.c
.PHONY:clean
clean:
rm-f *.o
以上就是编写makefile的过程,接下来的事情就是使用makefile了。
使用makefile
(1) 将main.c、fun.c和tou.h三个源程序文件和makefile放在同一个文件夹xuexi中,从终端中进入此文件,运行makefile即可产生可执行文件all,执行 all 即可,即./all
(2) 如果程序出现错误,可以使用clean命令清除产生的所有的.0文件,再执行步骤一即可
还有一些更好的编写makefile的方法,就是使用含参数的命令编写makefile,这里就不在多说了。还有gcc编译命令的使用方法可以参考其他资料。