Makefile and Make

       以gcc为例,     gcc编译分四步:

        1、预处理;执行处理语句,删除注释(预先护理部分语句)     

        命令:gcc -E filename.c -o filename.i  此命令的作用是在gcc执行完预处理后停下,-o后面是自己为生成的文件取名。         2、汇编;将C语言转化成汇编语言(检查C语言的语法正确性)     

       命令:gcc -S filename.i -o filename.s  将预处理生成的文件进行处理,在汇编完成后停止。     

        3、编译;将汇编语言转换成目标文件(二进制文件)     

        命令:gcc -c filename.s -o filename.o  将汇编生成的文件转换成二进制文件。     

       4、链接;确保多个目标文件组成的程序正常运行。     

        命令:gcc filename.o -o filename  链接多个二进制文件生成目标文件。     (只有在这个步骤执行真正的链接:动态或者静态)

 

当我们把一个文件拆分成多个.c文件,可以让每一个.c文件执行完第三步后停下,也就是生成多个.o文件,然后当修改某个函数时,只需要修改对应的.c文件,然后仅仅将这个.c文件再次编译生成新的.o文件,再将所有的.o文件进行链接,生成最后的执行文件。    

扫描二维码关注公众号,回复: 1320977 查看本文章

当拿到一个项目首先想它的函数可以分几部分,为每一部分创建一个.c文件,同时为每一个.c文件创建.h文件,每个.c文件中包含它到的头文件声明,以及对应的函数,每个.h文件仅仅写函数声明

现在就是makefile出场的时候了,它可以把1-4统一起来,对于大型项目,会有众多的c文件,从而导致同样多的.o文件,而且不同的编译器也会导致重新编译的困难,还有就是部分文件更新,能不能之重新编译设计到的文件,而不是一家有难,大家跟着遭殃。

有一个叫makefile的工具可以完美解决这个问题

上面的图片提供了三种方式。     

        第三列为第一种方式,1,3,5行的意思是  目标文件:依赖文件  也就是目标文件需要由哪些文件来产生。2,4,6行是对应的执行指令,需要注意的是每条指令前必须空一个Tab键的距离。这种的写法有两个缺点,1、当.c文件非常多的时候需要写的内容也非常多;2、当更换编译器的时候每条指令都需要更改,比如需要用winGW编译,那么所有的gcc指令都要更换。    

        第二列为第二种方式,这种方式解决第二个问题,但是每增一个.c文件还是要多写两条语句。    

        最后一列为第三种写法,这种方式完美解决了上述问题,需要更改的就只有前四行,具有很好的移植性。    编写完成后保存,需要编译时只需要键入make,所有的.c文件就会生成.o编译文件,最后生成执行文件,当修改其中一个.c时,它只将那个.c文件编译成新的.o文件,最后再将这个.o文件与其他.o文件链接生成新的执行文件。    

        但是如果我们想删除.o文件以及最后的目标文件,make工具给我们提供了一个简单的方式,在makefile文件中写入你要执行的指令,同时为它取别名Label,执行指令只需要make+label名即可。例如上面的makefile文件需要执行删除操,只需要键入:make clean即可。

Example:

vim test.c (i, ESC+:wq)

#include <stdio.h>
int main(void){
        printf("hello, world\n");
}

最简单编译:

Method 1.

       gcc test.c -o test,   ./test

Method 2.

      gcc -c test.c -o test.o

      gcc -c test.o -o test

     ./test

Method 3.

1) make clean
2) make

3) ./test

猜你喜欢

转载自www.cnblogs.com/mathlife/p/9120350.html