通过Makefile可以让编译这个动作变的很方便,只要键入make命令,make就会根据之前编写好的makefile去执行相应的命令。
make工具会去比较目标文件和源文件的时间戳,如果源文件比目标文件新,则会进行更新目标文件。否则不做任何操作。
首先要了解一下基础:
编译:编译器检测高级语言的语法、函数、变量声明是否正确。只有检测正确都正确才能编译出中间目标文件。(Linux默认为".o")
连接:将多个".o"文件和库文件链接成系统可执行的程序(Linux下执行格式为ELF)。
将".o"文件中使用的函数和其他".o"和库文件中的相关符号进行合并,并将所有符号进行重新安排,并连接相应的系统库函数。
通过工具ld最终生成可执行程序。
静态库:多个".o"的集合。通过ar工具生成。
生成静态库命令:ar rcs libhello.a hello.o
共享库:多个".o"的集合,但是通过特殊的方式生成(Linux格式为ELF,共享库已具备执行条件)。
共享库,同时可被多个程序是用,代码共享,但是数据独立。
生成共享库命令:gcc -shared -fPCI -o libhello.so hello.o
make编译原则:
1:源文件没有对应的目标文件,make则会根据规则编译
2:源文件被修改过了,make也会根据规则重新编译
3:头文件被修改了,则引用过这个头文件的所有源文件,都会根据规则重新编译
makefile规则:
make命令后不指定目标,则会默认执行第一个target,第一个target如果依赖别的target则依赖的target会被执行。
可以通过在make后边添加需要执行的目标来执行特定目标,例如:make clean
target:dependent
CMD(支持所有shell 命令)
dependent: dependent1
CMD(支持所有shell 命令)
dependent通过CMD命令生成target。如果dependent不存在,则会去查找生成dependent的规则,并执行。否则报错。
在CMD前面必须是一个TAB。make才会认为这是一个命令。
第一条规则之后,所有以[TAB]开始的命令,都会交给Shell去处理。
.PHONY : clean
clean:
@-rm *.o
target可以没有依赖,这种target比如clean这个目标,称为伪目标。@表示不打印出命令。
.PHONY告诉make,clean是个伪目标,没有依赖。但是也要执行。
Makefile Example:
OBJS=a.o b.o
hello:$(OBJS)
@gcc -o $@ $^
@echo "CC $@"
a.o:a.c a.h \
b.h c.h
@gcc -o $@ -c a.c
@echo "CC $@"
b.o:b.c a.h b.h
@gcc -o $@ -c b.c
@echo "CC $@"
clean:
@-rm -rf hello *.o
@echo "RM helo *.o"
执行输出:
make:
CC a.o
CC b.o
CC hello
make clean:
RM helo *.o
几个特殊含义的符号:
$@:表示目标文件
$^:表示此目标的所有依赖
$<:表示此目标的第一个依赖
如果一行写不下,可以通过"\"符号来切分,看似两行,其实是一行。注意:"\"后面不可以有空格等任何字符。
rm前面的"-"表示忽略此命令执行的错误
OBJS是一个变量,通过$(OBJS)来应用这个变量
>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<
"=" : 当整个makefile加载完后才确定其值,然后再展开。
a = 100
b = $(a)
a = 200
$(warning $(b))
结果为:b的值为200。b使用的=,获取等到makefile这个文件完全解析后,再展开a的值
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<
":=" :立刻展开a的值
a = 100
b := $(a)
a = 200
$(warning $(b))
结果为:b的值为100。b使用的:=,将立即展开a的当前值。
>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<
"?=" :如果之前赋值了,则不会去覆盖之前的值。
a = 100
a ?= 200
$(warning $(a))
结果为:a的值为100
>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
"+=":表示追加
a = 100
a += 200
$(warning $(a))
结果为:100 200
$(warning $(x)),这个是makefile内置的函数,显示当前行号和输出变量值。
阅读(1470) | 评论(1) | 转发(0) |