Makefile 学习日记(二)——有头文件的makefile

时间:2021-01-01 12:45:40

今天主要增加带.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会自动帮你生成你没有写的语句呢。。。。Makefile 学习日记(二)——有头文件的makefile


额,说好的带.h文件的编译呢?

根据我真实的书写和试验,真么没发现.h文件需要特别关注什么。(我是一边写例子一边写文章的)

其实呢,带.h的编译的精髓就是把头文件包含关系在代码里写清楚,写Makefile的时候就不需要关注了。。哇哈哈


----ps:

为了找cc    -c -o printfun.o printfun.c为毛会出来,翻了下大神写的Makefile实用手册,比我高深多了。。。。Makefile 学习日记(二)——有头文件的makefile。但是还是没有看到为毛这句话会出来。加油!!