第一个Makefile例子
1.Linux下adc实验的Makefile
adc-test: adc-test.c
arm-linux-gcc adc-test.c -Wall -O2 -o adc-test
arm-linux-strip -s adc-test
clean:
rm adc-test
GCC所支持后缀名解释
.m | Objective-C原始程序 |
.i | 已经过预处理的C原始程序 |
.ii | 已经过预处理 C++原始程序 |
.S/.s | 汇编语言原始程序 |
.o | 目标文件 |
.a/.so | 编译后的库文件-g 生成带调式信息的可执行文件 |
strip
通过删除可执行文件中ELF头的 typchk段、符号表、字符串表、行号信息、调试段、注解段、重定位信息等来实现缩减程序体积的目的。
而被剪裁过的可执行文件不可进行还原。
参数
-H 删除文件头(不删除符号表)
-l 删除行号信息
-r 删除调试段、typchk段、符号表(不删除外部符号、静态符号与重定位信息)
-t 删除符号表 (不删除函数符号与行号信息)
-x 删除重定位信息、符号表 (不删除外部符号、静态符号)
-X[mode] 删除文件特定符号信息(mode: 32、64、32_64 | 模式: 32位 、64位、32_64位等符号表)
第二个例子:
CROSS=arm-linux-
all: buttons
buttons: buttons_test.c
$(CROSS)gcc -o buttons buttons_test.c
clean:
@rm -vf buttons *.o *~
Makefile 中常见自动变量
$* | 不包含扩展名的目标文件名称 |
$+ | 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件 |
$< | 第一个依赖的名称 |
$? | 所有时间戳目标文件晚的依赖文件,并以空格分开 |
$@ | 目标文件的完整名称 |
$^ | 所有不重复的依赖文件,以空格分开 |
$% | 如果目标是归档成员,则该变量表示目标的归档成员名称 |
例子
OBJS = main.o
CC = gcc
CFLAGS = -Wall -O -g
edit :$(objects)
$(CC) $^ -o $@
main.o : main.c defs.h
$(CC) $(CFLAGS) -c $< -o $@
对应的程序为
edit :main.o
gcc -o edit main.o
main.o : main.c defs.h
gcc-Wall -O -g -c main.c -o main.o