makefile相关

1 伪目标:
使用关键字.PHONY 标识的,例如:
.PHONY : all clean
后面的all clean都是伪目标,伪目标的一个特点是,由于其是一个伪目标,因此在磁盘上实际是不存在该文件的,因此,当以伪目标作为目标的时候,其后面的文件总是比他新,因此,其后面的命令总是会执行(makefile规则是,如果依赖项中有一个以上的文件比target文件要新,那么其后面定义的命令就会被执行)。
更详细可以参考这篇文章:http://www.cnblogs.com/chenyadong/archive/2011/11/19/2255279.html
但需要注意以下几点:
a 当伪目标后面没有依赖项时,比如下面的代码中的clean,其是伪目标,但是后面没有依赖项,因此,make就不会去寻找文件的依赖性,也就不会执行后面的操作,如果需要执行clean后面的内容,就需要显式的执行make clean,另外,如果clean不是伪目标,而且后面什么也没有跟的话,也是一样的
b 当一个目标不是第一个目标(默认目标,也就是要生成的目标)时,如果其与内有与第一个目标进行直接或间接关联(被第一个目标直接或间接依赖),那么,其后的内容也不会被执行,不管是不是伪目标或者后面有没有跟依赖项
c 当编译代码时,如果不是每次都需要重新编译,那么不建议将第一个目标就设成伪目标:

.PHONY : all
all : 
    gcc -o $@ $<

在上面的代码中,由于all时伪目标,不存在,main不是伪目标,因此,每次make检查时都发现main比all新,因此都执行
改成下面的这样就可以了:

.PHONY : all
all : main
main:main.cpp
    gcc -o $@ $<

2 makefile中的第一个目标会当成默认目标,就是要生成的目标。
伪目标也可以作为“默认目标”,前提就是你把伪目标放在第一个。需要注意的是.PHONY 只是定义了伪目标。因此即使.PHONY all放在第一行,all也不会成为默认目标。

3 伪目标也可以成为依赖项,例如:

.PHONY : all clean
all: $(TARGET) clean
clean:
    rm $(TARGET)

第一行定义了2个伪目标,第二行是该makefile文件的第一个目标文件,也就是该makefile的默认目标文件,因此该makefile的目标就是生成该all后面的文件,包括生成该TARGET,以及后面的clean

4 如果要通过一个makefile文件同时执行多个文件下的makefile文件,可以按照如下格式写一个makefile,假设当前目录下有6个文件夹,6个文件夹下各自都有一个makefile文件,如果要嵌套执行make命令,可以参考pdf:跟我一起写makefile,中,第六部分,四,嵌套执行make:

.PHONY : make_all make_clean
make_all:
    cd A && make
    cd B && make
    cd C && make
    cd D && make
    cd E && make
    cd F && make
    cd G && make
make_clean:
    cd A && make clean
    cd B && make clean
    cd C && make clean
    cd D && make clean
    cd E && make clean
    cd F && make clean
    cd G && make clean

上面的代码中,有两个伪目标,其中make_all在第一,因此,将执行make_all后面的命令,如果想在执行make_all后执行make_clean,可以在make_all后面加上:
make_all:make_clean

makefile中一些符号的意思:
命令中,
$@代表当前规则下的目标文件列表
$<指代依赖项的第一个依赖文件
$^表示依赖文件列表中所有的依赖文件
$?表示依赖文件中比目标文件新的依赖文件列表
+( ^会去掉依赖项中的重复项,类似“$^”,但是它保留了依赖文件中重复出现的文件。主要用在程序链接时库的交叉引用场合。)

更详细的解释:
http://www.cnblogs.com/wzheng/p/3544861.html

下面有关于makefile下的一些通配符的介绍:
http://blog.csdn.net/liangkaiming/article/details/6267357

嵌入式移植下一些比较有用的命令:
ldd 可执行文件或动态库依赖于哪些库文件,以及相应的库文件是否已经找到
nm 查看库文件中有哪些符号,比如函数符号,一些常见的比较有用的参数有:
-u:列出未定义的符号
readelf命令,用于查看elf格式的目标文件的信息:
对应的平台(比如是arm,还是amd64等),或对应的嵌入式库文件是支持的硬浮点还是软浮点:
查看elf文件的头信息,包括支持的架构:pc或arm,以及对应文件是32位还是64位
readelf -h libxxx.so
能够查看编译出来的库文件是否有支持硬浮点
readelf -A libxxx.so
如果打印出来有下面这一行,则说明支持硬浮点:
Tag_ABI_VFP_args: VFP registers

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值