还是先看例子:
原料:main.c printfun.c methed.c 及其.h文件
//main.c
#include "main.h"
void main()
{
print_f();
printf("\n%d+%d=%d\n",1,4,addfun(1,4));
}
//main.h
#include "stdio.h"
#include "printfun.h"
#include "methed.h"
//printfun.c
#include "printfun.h"
void print_f()
{
printf("\nwelcom to learn Makefile!\n");
}
//printfun.h
#include "stdio.h"
void print_f();
//methed.c
#include "methed.h"
int addfun(int a,int b)
{
return a+b;
}
int minusfun(int a,int b)
{
return a-b;
}
//methed.h
int addfun(int a,int b);
int minusfun(int a,int b);
Makefile文件:
main:main.o printfun.o methed.o
gcc -o main *.o
clearn:
rm -rf -v *.o main
test:
echo "test"
运行结果:
[root@bogon c3]# make
cc -c -o main.o main.c
cc -c -o printfun.o printfun.c
cc -c -o methed.o methed.c
gcc -o main *.o
总结如下:
1,是不是发现我写的简单了?对,我把能省的都省了,我就是想看看我省掉【预置条件1,2,3】后,makefile会怎么办。结果很好,他都会自己对响应的文件进行编译。
2,【cmd1】我使用了*.o,用这个的时候还出现过一点问题?
能不能在【预置条件1,2,3】里使用呢?答案是不能的。
修改后的Makefile:
main:*.o
gcc -o main main.o printfun.o methed.o
clearn:
rm -rf -v *.o main
test:
echo "test"
运行结果:
[root@bogon c3]# make
cc -c -o *.o printfun.c
gcc -o main main.o printfun.o methed.o
gcc: error: main.o: No such file or directory
gcc: error: printfun.o: No such file or directory
gcc: error: methed.o: No such file or directory
gcc: fatal error: no input files
compilation terminated.
make: *** [main] Error 4
3,从打印结果看cc -c -o *.o printfun.c
*.o是被当做-o输出的,也就是 *.o被整体当做一个【伪目标】,而不是一个通配的值。经过其他实验发现每次都是 printfun.c 再编译。需要高手解释下啊。
4,我们可以看到假设我们的c文件越来越多,我们要写的【预置条件1,2,3,4….】也要越多。不合理啊。。。所以一定有方法让我们简化写makefile的途径
5,其实已经有一个途径了,如在【cmd命令】中使用通配符*,但是千万要注意通配符不能乱用,否则就会导致上面例子的错误。
6,那么既然我们写的不对Makefile就进行不下去,也就是说Makefile与其他的很多东西一样是有规则要求的。
所以为了更快的写Makefile,明天开始研究Makefile中的语法及规则。