完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
makefile不仅仅是一个命令的集合体,其中有一些规则是需要理解掌握的。
首先,了解makefile的规则: //-----------格式---------- 目标 : 依赖1,依赖2 (TAP键)命令 //------------------------- 1、目标,就是我们想生成的文件。 2、依赖往往是我们已经有的文件,是生成目标的必要条件。 3、命令就是利用依赖来产生目标。 命令不是任何情况都可以执行的,它是有条件的: 1、目标不存在 or 2、依赖已更新(首先依赖是存在的)。 牛刀小试: 1、编译和链接放一块了: hello: hello.c a.c gcc -o hello hello.c a.c hello是目标,命令执行后会被生成。hello可通过“.hello”执行。 gcc 可以理解为是linux中的一个软件,而 -o 就是软件中的一个按键(选项),hello.c a.c就是已经添加的模块文件。 这就是命令,就像是你在windows里打开一个软件,添加文件,然后按下编译按钮。命令就是这么一回事。 2、编译和链接分开: 过程分析:首先目标hello 依赖于 hello.o 和 a.o 结果这两个依赖不存在,那么向下找目标。 发现目标hello.o,依赖于hello.c(这个是存在的)。满足目标不存在 那么执行命令 gcc -o hello -c hello.c//表示编译hello.c输出hello.o但不链接。 下边的同理。。。。。。。 现在两个.o文件都有了,那么这条命令可以执行了: gcc -o hello hello.o a.o//链接这两个文件,输出hello可执行文件。 这样的好处是: 利用规则:1、目标不存在。or 2、依赖已更新(首先依赖是存在的)。 可以不编译,没有修改的文件,从而节省编译时间。 最后,还可以简写: 分析下: $@ 表示的是目标(的集合); $^ 表示的是依赖(的集合); %.o 表示所有的.o文件 %.c 表示所有的.c文件 $< 表示(目标:后面列表里)第一个依赖! 这里提一点: 1、当我们执行make的时候,我们的目的是,参数该文件的第一个目标,就是hello。所以clean 下的命令并不会执行。 2、clean是一个虚拟的目标,并没有依赖项。我们可以通过 make clean 这个命令去执行它下边这个命令(清楚掉所有的.o文件) 再来看一个复杂一点的: 第一行是什么,意思目前我也不知道,可以把它看成是一个函数,makefile中调用函数的方式就是”$( ) ” ARM-linux-gcc 就是linux的中的另一个软件了——交叉编译器。 何为,交叉编译?就是在一个平台编译,生成一个可以在另一个平台运行的文件。 具体看看这句: arm-linux-gcc $(CFLAGS) -c -o crt0.o crt0.S 看着“-c -o crt0.o crt0.S”这条命令的顺序,你是否感觉奇怪? 如果,你把-c -o 理解成两个按键,感觉可能好很多。 之所以这么随意的顺序,去写,是因为这些选项往往有一个特性,就是忽略掉后面自己不需要的文件。 这段makefile以后还会具体分析,今天就到这里~~ 2014-11-25 宋桓公 |
|
相关推荐
3个回答
|
|
gcc 可以理解为是linux中的一个软件,而 -o 就是软件中的一个按键(选项),hello.c a.c就是已经添加的模块文件。
这就是命令,就像是你在windows里打开一个软件,添加文件,然后按下编译按钮。命令就是这么一回事----生动 |
|
|
|
不错 喜欢!!!
|
|
|
|
好!共同学习,共同进步
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2228 浏览 6 评论
2027 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4590 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-23 09:36 , Processed in 0.498121 second(s), Total 51, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191