Chinaunix首页 | 论坛 | 博客
  • 博客访问: 437687
  • 博文数量: 71
  • 博客积分: 26
  • 博客等级: 民兵
  • 技术积分: 1246
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-23 14:46
个人简介

linux --- 一切皆文件

文章分类

全部博文(71)

文章存档

2021年(1)

2019年(2)

2018年(4)

2017年(7)

2016年(11)

2015年(1)

2014年(2)

2013年(33)

2012年(10)

分类: LINUX

2016-02-05 16:05:30

通过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) |
0

上一篇:python基础

下一篇:Makefile学习(二)

给主人留下些什么吧!~~

bbtdebb2016-02-05 16:15:44

哦。朕知道了。