-
我们在开发程序的过程中,一般使用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的所有文件都会重新编译。