论Makefile的重要性(一)-----Linux C开发
我们在开发程序的过程中,一般使用IDE较多,用C++、C#的使用Vistual Studio2012或者更高版本,用Java的使用Eclipse。一般企业使用这些IDE较多。但是在Linux环境下编程,我们使用什么呢,刚接触Makefile的时候感觉这货很神奇。用的久了就会发现话会大大的提高开发项目的效率,有人会说,我们一般不开发大型项目,就是写点小程序,用不着使用什么Makefile,但是如果你用过一次,我相信你会爱不释手,如果你掌握了如何编写Makefile,会对你将来的开发生涯有莫大的帮助,接下来咱们进入正题。
在C/C++语言开发过程中,我们首先是把源文件编译成中间代码,在Windows下就是.obj文件,Linux下就是.o文件,即目标文件(object file),然后将 大量的.obj/.o文件通过链接(link)生成可执行文件。
Makefile的规则:
target(目标):prerequisites(依赖/条件)
command (命令)
其中target是object file,可以依赖多个目标文件,prerequisites是生成target所需的文件或目标。command就是make要执行的命令。下面举例说明:
创建一个工程math,其中包含5个.c文件和一个.h文件。
sub.c int sub(int a, int b) { return a-b; } mul.c int mul(int a, int b) { return a*b; } div.c int devl(int a, int b) { return a/b; } add.c int add(int a, int b) { return a+b; }
main.c int main(void) { printf("add:%d\n",add(1,2)); printf("sub:%d\n",sub(1,2)); printf("mul:%d\n",mul(1,2)); printf("div:%d\n",div(1,2)); }
common.h #ifndef MYMATH_H_ #define MYMATH_H_ int add(int a, int b); int sub(int a, int b); int mul(int a, int b); int devl(int a, int b); #endif
以下就是makefile的最简单写法:
libmath.a:add.o sub.o mul.o devl.o ar rcs libmath.a add.o sub.o mul.o devl.o add.o:add.c gcc -c add.c sub.o:sub.c gcc -c sub.c mul.o:mul.c gcc -c mul.c devl.o:devl.c gcc -c devl.c .PHONY:clean clean: rm -f add.o sub.o mul.o devl.o
在make之前 yun@Kyrie:~/yunfan/mf$ ls add.c common.h div.c main.c Makefile mul.c sub.c
在make之后
yun@Kyrie:~/yunfan/mf$ make
gcc -c add.c
gcc -c sub.c
gcc -c div.c
gcc -c mul.c
ar rcs libyunfan.a add.o sub.o div.o mul.o
yun@Kyrie:~/yunfan/mf$ ls
add.c common.h div.o main.c mul.c sub.c
add.o div.c libyunfan.a Makefile mul.o sub.o
yun@Kyrie:~/yunfan/mf$ make clean
rm -f add.o sub.o div.o mul.o
yun@Kyrie:~/yunfan/mf$ ls
add.c common.h div.c libyunfan.a main.c Makefile mul.c sub.c
如果修改其中一个.c后,在执行make时,与此.c的所有文件都会重新编译。