标签:
首先看个makefile范例:
1 /*指明工具链,并为其取个简单的别名*/ 2 CC = arm-linux-gcc 3 LD = arm-linux-ld 4 AR = arm-linux-ar 5 OBJCOPY = arm-linux-objcopy 6 OBJDUMP = arm-linux-objdump 7 /*指明头文件的位置*/ 8 INCLUDEDIR := $(shell pwd)/include 9 /*-Wall 提示警告,-O2表示优化选项,最优优化,-fno-builtin表示自己来实现某些库函数,如果不加此选项会出现冲突*/ 10 CFLAGS := -Wall -O2 -fno-builtin 11 /*-nostdinc,-nostdlib 表示不使用这两个库,-I$(INCLUDEDIR)表示链接到头文件*/ 12 CPPFLAGS := -nostdinc -I$(INCLUDEDIR) -nostdlib 13 14 /*使这些定义的变量生效*/ 15 export CC AR LD OBJCOPY OBJDUMP INCLUDEDIR CFLAGS CPPFLAGS 16 17 /**将.o文件和lib/目录下生成的.a静态库一起编译成.elf文件*/ 18 objs := start.o main.o uart.o clock.o lcd.o lib/libc.a 19 20 lcd70.bin: $(objs) 21 ${LD} -Tlcd70.lds -o lcd70.elf $^ //主要此处使用了Tlcd70.lds这个链接器脚本指明的代码的存放位置。 22 ${OBJCOPY} -O binary -S lcd70.elf $@ 23 ${OBJDUMP} -D lcd70.elf > lcd70.dis 24 25 /*指明伪目标,也就是没有依赖文件*/ 26 .PHONY : lib/libc.a 27 /*进入目录中执行make命令生产.a静态库*/ 28 lib/libc.a: 29 cd lib; make; cd .. 30 31 %.o:%.c 32 ${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $< 33 34 %.o:%.S 35 ${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $< 36 37 clean: 38 make clean -C lib 39 rm -f *.bin *.elf *.dis *.o
生产静态库的makefile:
objs := div64.o lib1funcs.o ctype.o muldi3.o printf.o string.o vsprintf.o /*生产静态库*/ libc.a: $(objs) ${AR} -r -o $@ $^ /*将.c和.S文件生成.o文件*/ %.o:%.c ${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $< %.o:%.S ${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $< clean: rm -f libc.a *.o
链接器脚本:
SECTIONS { . = 0x40000000; //指明了程序的开始运行地址 .text : { start.o//指明第一个要运行的文件 * (.text) } .data : { * (.data) } .bss : { * (.bss) } }
标签:
原文地址:http://www.cnblogs.com/defen/p/5400492.html