今天主要增加带.h的编译
------------------------------------------------------------------
原料:main.c main.h printfun.c printfun.h
//main.c
#include "main.h"
void main()
{
print_f();
}
//main.h
#include "stdio.h"
#include "printfun.h"
//printfun.c
#include "printfun.h"
void print_f()
{
printf("\nwelcom to learn Makefile!\n");
}
//printffun.h
#include "stdio.h"
void print_f();
Makefile文件:
main:main.o printfun.o
gcc -o main main.o printfun.o
main.o:main.c
gcc -c main.c
printfun.o:
gcc -c printfun.c
clearn:
rm -rf -v *.o main
test:
echo "test"
运行结果:
[root@bogon c3]# make
gcc -c main.c
gcc -c printfun.c
gcc -o main main.o printfun.o
--------------------------------------------------------------------
可以看到:
1,makefile文件中没有任何.h文件
2,其实仔细看.c文件包含关系的话,会发现main.c和。printfun.c都有包含各自的头文件
3,为了证实一些事情我们把Makefile文件做简单的修改
----------------------------------------------------------------
Makefile文件:(修改)
main:1 2
gcc -o main main.o printfun.o
1:
gcc -c main.c
2:
gcc -c printfun.c
clearn:
rm -rf -v *.o main
test:
echo "test"
运行结果:
[root@bogon c3]# make
gcc -c main.c
gcc -c printfun.c
gcc -o main main.o printfun.o
----------------------------------------------------------------
把【目标】main的前置条件改为随便的一个值[1,2],而前置条件[1,2],分别作为【伪目标】。Makefile运行的过程是正常的,这个实验证明,前置条件的名字可以随便取,而不是非要用xxx.o作为前置条件的。蛋为毛我们见到的前置条件都是用的xxx.o呢,主要是为了大工程的Makefile书写方便,具体怎么方便,后面研究。就我目前的感官来说,应该是命名格式统一,方便阅读;为以后的统一替换做伏笔。
4,我们在改下Makefile
----------------------------------------------------
makefile文件:(修改2)
main:main.o printfun.o
gcc -o main main.o printfun.o
main.o:
gcc -c main.c
#printfun.o:
# gcc -c printfun.c
clearn:
rm -rf -v *.o main
test:
echo "test"
注释掉 【前置条件2】作为【伪目标】的语句
运行结果:
[root@bogon c3]# make
gcc -c main.c
cc -c -o printfun.o printfun.c
gcc -o main main.o printfun.o
--------------------------------------------------------------
结果:
1,自动多了一行cc -c -o printfun.o printfun.c
2,如果把【目标】main的【前置条件2】printfun.o去掉或者改名字为2,会出现Makefile语法错误
[root@bogon c3]# make
gcc -c main.c
make: *** No rule to make target `2', needed by `main'. Stop.
如果把【目标】main内的命令中的 printfun.o去掉会出现编译错误
[root@bogon c3]# make
gcc -o main main.o
main.o: In function `main':
main.c:(.text+0xa): undefined reference to `print_f'
collect2: error: ld returned 1 exit status
make: *** [main] Error 1
3,所以根据测试会出现两个结论
1>makefile有一套自己生成xxx.o的规则,具体是什么规则我得慢慢研究,发现
2>最好把【目标】的前置条件写成xxx.o的形式,说不定某个时刻,makefile会自动帮你生成你没有写的语句呢。。。。
额,说好的带.h文件的编译呢?
根据我真实的书写和试验,真么没发现.h文件需要特别关注什么。(我是一边写例子一边写文章的)
其实呢,带.h的编译的精髓就是把头文件包含关系在代码里写清楚,写Makefile的时候就不需要关注了。。哇哈哈
----ps:
为了找cc -c -o printfun.o printfun.c为毛会出来,翻了下大神写的Makefile实用手册,比我高深多了。。。。。但是还是没有看到为毛这句话会出来。加油!!