在linux项目中,源码的编译一般分为手动和自动,两种方法都是基于gcc实现的。但在修改和重新编译的便捷程度上来说,手动不如自动,而自动编译一般是基于makefile来实现的编译。

makefile尤其是在中大型C Project中是非常有用的,实现了代码修改和编译的解耦合。实例如下:

code.c

//code.c
#include "code.h"
int myfun(int in){
  return in + 1;
}

code.h

//code.h
extern int myfun(int);

prog.c

//prog.c
#include<stdio.h>
#include "code.h"
int main(void){
  int i = 1;
  printf("myfun(i) = %d\n",myfun(i));
}

如上实例其实比较简单,手动编译的话其实也只需要三行命令实现,如下:

gcc -c code.c -o code.o
gcc -c prog.c -o prog.o
gcc prog.o code.o -o test

但是如果我们通过makefile,其实可以只通过更为简短好记的命令完成编译:

Makefile

test: prog.o code.o
    gcc prog.o code.o -o test
    ./test
prog.o: prog.c code.h
    gcc -c prog.c -o prog.o
code.o: code.c code.h
    gcc -c code.c -o code.o
clean:
    rm -f *.o test

命令:

make test    //实现编译并运行
make clearn    //清除中间文件和编译后的可执行文件

通过比较手动和自动,不难发现基于makefile的自动编译省去了敲命令的时间,还减少了gcc命令的输入错误和输入时间,有助于后期项目的修改和维护。

详解Makefile文件逻辑

makefile的撰写逻辑其实是非常清晰的,想象有一颗倒过来的树,树的顶端就是你最终想要实现的可运行的文件,而依次往下就是你要编译的文件,得到的图解就会如下图所示:(基于上面的实例做示范)

make工作树
借助工作树,可以帮助你更好的理解项目的依赖和编译过程.与此同时它也可以辅助你快速的写出项目的makefile文件实现项目的自动编译。

通过上面的工作树,我们可以得知:makefile里每一次编译动作的执行都需要两个参数(clean动作除外),如:
test: prog.o code.o
对此再进一步总结,就可以得出格式如下:

目标文件:    依赖文件列表
TAB命令
...
TAB命令
...

拓展

以上只是最简单和最基础的makefile的使用,进阶可以参考:
Makefile入门(超详细一文读懂)
全网最牛Linux内核Makefile文件详解

标签: linux, 技术

仅有一条评论

  1. 111 111

    https://blog.csdn.net/github_27609763/article/details/46370023

添加新评论