- 第二章 关于程序的编译和链接
编译时,编译器检查语法,函数和变量是否被声明。编译器把源文件(.c)编译成中间代码文件(.o)。
链接时,链接器链接函数和全局变量。链接器会在所有的obj中找寻函数的实现。
- 第三章 Makefile介绍
一,Makefile的规则
target ... :prerequisites ...
command
...
...
prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则,也就是Makefile中最核心的内容。
三,make是如何工作的
make会一层又一层的去找文件的依赖关系,直到最终编译出第一个目标文件。make只管文件的依赖性。
demo.hex: demo.axf
fromelf --i32 --output demo.hex demo.axf
main.o: command.h main.c
armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork main.c -o main.o
command.o: command.c
armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork command.c -o command.o
startup.o: startup.s
armasm --cpu Cortex-M3 -g --apcs=interwork startup.s -o startup.o
demo.axf: main.o command.o startup.o
armlink --cpu Cortex-M3 *.o --strict --scatter "demo.sct" \
--summary_stderr --info summarysizes --map --xref --callgraph --symbols \
--info sizes --info totals --info unused --info veneers \
--list ".\demo.map" \
-o demo.axf
clean:
rm demo.axf main.o startup.o command.o demo.htm demo.map
四,makefile中使用变量
objects = main.o command.o startup.o
demo.hex: demo.axf
fromelf --i32 --output demo.hex demo.axf
main.o: command.h main.c
armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork main.c -o main.o
command.o: command.c
armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork command.c -o command.o
startup.o: startup.s
armasm --cpu Cortex-M3 -g --apcs=interwork startup.s -o startup.o
demo.axf: $(objects)
armlink --cpu Cortex-M3 *.o --strict --scatter "demo.sct" \
--summary_stderr --info summarysizes --map --xref --callgraph --symbols \
--info sizes --info totals --info unused --info veneers \
--list ".\demo.map" \
-o demo.axf
clean:
rm $(objects) demo.axf demo.htm demo.map
五,让make自动推导
只要make看到一个.o文件,它就会地总的把.c文件加在依赖关系中。比如make找到一个whatever.o,那么whatever.c就会是whatever.o的依赖文件。
六,另类风格的makefile
objects = main.o command.o startup.o
demo.hex: demo.axf
fromelf --i32 --output demo.hex demo.axf
main.o command.o: command.h main.c command.c
armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork main.c command.c -o main.o command.o
startup.o: startup.s
armasm --cpu Cortex-M3 -g --apcs=interwork startup.s -o startup.o
demo.axf: $(objects)
armlink --cpu Cortex-M3 *.o --strict --scatter "demo.sct" \
--summary_stderr --info summarysizes --map --xref --callgraph --symbols \
--info sizes --info totals --info unused --info veneers \
--list ".\demo.map" \
-o demo.axf
clean:
rm $(objects) demo.axf demo.htm demo.map
七,清空目标文件的规则
一般风格
clean:
rm edit $(objects)
更为稳健的做法是:
.PHONY: clean
clean:
-rm edit $(objects)
- 第四章 Makefile总述
Makefile里主要包含了五个东西:显示规则/隐晦规则/变量定义/文件指示/注释。
其中文件指示包括三个部分:一个是在Makefile中引用另一个Makefile(类似C语言的include);另一个是指根据某些情况制定Makefile的有效部分(类似C语言的#if);还有一个是定义一个多行的命令(这里先不讲)。
- 第五章,书写规则
规则包含两个部分,一个是依赖关系,一个是生成目标的方法。
规则举例
foo.o : foo.c defs.h # foo模块
cc -c -g foo.c
在规则中使用通配符
如果我们想定义一系列比较类似的文件,我们很自然地就想起使用通配符。make支持三种通配符 * ? [...]
波浪号~字符在文件名种也有比较特殊的用途。
#objects = main.o command.o startup.o
objects := $(patsubst %.c,%.o,$(wildcard *.c))
objects += $(patsubst %.s,%.o,$(wildcard *.s))
$(warning $(objects))
demo.hex: demo.axf
fromelf --i32 --output demo.hex demo.axf
#main.o: command.h main.c o
# armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork main.c -o main.o
#command.o: command.c
# armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork command.c -o command.o
%.o:%.c
armcc -c --cpu Cortex-M3 -g -O0 --apcs=interwork $< -o $@
#startup.o: startup.s
# armasm --cpu Cortex-M3 -g --apcs=interwork startup.s -o startup.o
%.o:%.s
armasm --cpu Cortex-M3 -g --apcs=interwork $< -o $@
demo.axf: $(objects)
armlink --cpu Cortex-M3 *.o --strict --scatter "demo.sct" \
--summary_stderr --info summarysizes --map --xref --callgraph --symbols \
--info sizes --info totals --info unused --info veneers \
--list ".\demo.map" \
-o demo.axf
.PHONY:clean
clean:
-rm $(objects) demo.axf demo.htm demo.map
第七章,使用变量
变量的基础
变量在声明时需要给予初值,而在使用时,需要给在变量名前加上$符号,单最好用小括号()或大括号{}把变量给包括起来。变量会在使用它的地方精确的展开,就像C种的宏一样。