Makefile 文件里面
用 :=,表示变量赋值的时候立刻展开。
用 =,表示变量被用的时候才展开。
?= 是条件赋值, 比如
foo ?= $(bar)
只有当foo变量还没有被定义的时候,才会将bar的值赋给foo。
“+=” :变量值追加
eg:
objects = main.o foo.o bar.o utils.o
objects += another.o
3.set -e命令设置当前Shell进程为这样的状态:如果它执行的任何一条命令的退出状态非零则立刻终止,不再执行后续命令.
4fneq和ifeq条件语句,在这些语句块中是不能用自动变量的($@,$^,$<),另外要make clean的话不需要构建依赖文件
5.
如果make
执行的命令前面加了@字符,则不显示命令本身而只显示它的结果; Android中会定义某个变量等于@,例如 hide:= @
通常make
执行的命令如果出错(该命令的退出状态非0)就立刻终止,不再执行后续命令,但如果命令前面加了-
号,即使这条命令出错,make
也会继续执行后续命令。
rm
命令和
mkdir
命令前面要加
-
号,因为
rm
要删除的文件可能不存在,
mkdir
要创建的目录可能已存在,这两个命令都有可能出错,但这种错误是应该忽略的
6.
1、先了解程序从无到有的过程,即编译到执行。
(图片的引用来自互联网)
下面用实例来演示整个过程。
以一个.c文件来演示吧,这里只谈讨编译到运行的过程,不讨论编码的复杂度。
add.c
- #include "stdio.h"
- int add(int x,int y){
- return x+y;
- }
- void main()
- {
- int c;
- c = add(20,30);
- printf("%d",c);
- }
(1)先将源文件进行预编译产生.i文件
使用GCC的-E参数。
gcc -E -c add.c -o add.i
可以使用cat add.i来查看.i中的内容,内容太多我就不贴了。
cat -n add.i
(2)通过.i文件来产生汇编文件.s
gcc -S add.i
(3)通过.s文件生成.o文件(目标连接文件,即中间文件)
gcc -c add.s
(4)通过.o文件连接成最终的执行文件。
gcc add.o -o add
(5)最后执行生成的可执行文件。
./add