Linux makefile 学习笔记
来源:互联网 发布:淘宝网怎么用微信支付 编辑:程序博客网 时间:2024/04/24 08:03
因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
关于程序的编译和链接
编译:无论是C、C++首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件。编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。
链接:主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。
总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的Object File.
我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。
使用规则
目标文件 : 先决条件 命令目标文件:可以是object file、可执行文件或者是一个标签
先决条件:生成目标文件所需的目标或文件
命令:要执行的命令
这里要注意的是:命令这一行需要tab键开头,否则编译器是无法识别的。
makefile的执行,是通过比较目标文件和先决条件这两部分文件的日期,如果先决条件文件日期比较新或者目标文件不存在,那么makefile就会去执行后续定义的命令
说了这么多,实例走起,要上车的不要错过:
main.c文件
#include <stdio.h> #include "math.h" int main() { int sum = 0; sum = add(4, 3); printf("sum:%d", sum); int result = 0; result = divide(4, 0); printf("result:%d\n", result); return 0; }
#include "math.h" int add(int x, int y) { return x + y; }
#include <stdio.h> #include "math.h" int divide(int x, int y){ if(y == 0){ printf("y can't be zero\n"); return 0; } return x / y; }
minus.c文件
#include "math.h" int minus(int x, int y){ return x - y; } multiply.c文件 #include "math.h" int multiply(int x, int y){ return x * y; }
math.h文件
int add(int x, int y);int minus(int x, int y);int divide(int x, int y);int multiply(int x, int y);现在,在我的当前目录下有main.c add.c minus.c divide.c multiply.c 和math.h六个文件,下面的内容就会围绕这几个文件来举例讲述。
1、创建并编辑makefile文件(也可以命名为Makefile)
clean在这里不是一个文件,是一个标签,它冒号后面什么也没有,那就是说make不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。
这里clean的作用是删除可执行文件和目标文件。如果想要执行这一命令,直接用make clean即可。如果要生成可执行文件,则执行make。14
- linux学习笔记-makefile
- linux学习笔记-Makefile-$
- Linux makefile 学习笔记
- 【Linux 学习笔记】关于Makefile
- linux学习笔记-Makefile规则
- Makefile学习笔记3:Linux下makefile基础 (zz)
- linux makefile学习笔记(1)
- linux makefile学习笔记(2)
- linux makefile学习笔记(4)
- linux makefile学习笔记(4)
- linux makefile学习笔记(5)
- Linux内核---7.Makefile学习笔记
- Linux学习笔记——Makefile教程
- Linux笔记之Makefile
- Linux内核Makefile笔记
- Linux Makefile 整理笔记
- makefile 《Linux程序设计笔记》
- Makefile学习笔记
- k好数----------java
- 6.jsp总结
- Opencv绘制最小外接矩形、最小外接圆
- android 如何使用spinner来实现选择省份和市区功能
- RESTful 详解
- Linux makefile 学习笔记
- C++中操作符重载
- 区间DP 洛谷 P1799 数列
- 阿里云双十一活动,如何购买2U 4G 5M的云主机最划算 1500/年 4500/三年
- Unity中预编译 宏定义
- CodeForces 332B Maximum Absurdity
- dij算法
- numpy深入理解(2) indexing: integer array & boolean array
- 3311-数据结构实验之串三:KMP应用