文章目录
一、汇编版本
# 工程名对应的变量
NAME=asm-led
# 交叉编译器的前缀的变量,不同的交叉编译器的前缀可能不同
CROSS_COMPILE = arm-linux-gnueabihf-
# arm-linux-gnueabihf-gcc : 编译器
CC = $(CROSS_COMPILE)gcc
# arm-linux-gnueabihf-ld : 链接器
LD = $(CROSS_COMPILE)ld
# arm-linux-gnueabihf-objcopy : 格式化拷贝命令
OBJCOPY = $(CROSS_COMPILE)objcopy
# arm-linux-gnueabihf-objdump : 反汇编命令
OBJDUMP = $(CROSS_COMPILE)objdump
# Makefile文件本质是由很多规格构成
# 规则包含:目标,依赖,命令
# 目标:依赖
# (tab键)命令
all:
@# 将.S文件编译生成.o文件
@# -O0 : 代码的优化等级,不优化
$(CC) -O0 -g -c $(NAME).S -o $(NAME).o
@# 将.o文件链接生成.elf格式文件
@# -Ttext:指定程序入口地址,参数为物理地址
$(LD) -Ttext=0xC0008000 $(NAME).o -o $(NAME).elf
@# 将.elf文件格式化拷贝生成.bin文件
$(OBJCOPY) -O binary $(NAME).elf $(NAME).bin
@# 将elf格式文件生成.dis的反汇编文件
$(OBJDUMP) -D $(NAME).elf > $(NAME).dis
clean:
rm -rf *.elf *.bin *.o *.dis
install:
sudo cp $(NAME).bin /mnt/hgfs/share/
二、C语言版本
(一)Makefile文件
#CROSS_COMPILE:定义了交叉编译工具链的前缀,
#这里是arm-linux-gnueabihf-,用于编译针对ARM架构的代码。
CROSS_COMPILE = arm-linux-gnueabihf-
#NAME:项目名称,可以在命令行使用NAME参数赋值进行指定
#如:make NAME=led; 注意此时下载时 make install NAME=led
NAME = interface
#=============================================================================#
#CFLAGS:定义了C编译器的标志(flags)
#添加gdb调试信息(-g)
#指定ARM架构(-marm)
#显示所有警告(-Wall)
#关闭优化(-O0)选值范围在-O0~-O2,-O2优化等级最高
#指定ABI(-mabi=apcs-gnu)
#启用NEON浮点支持(-mfpu=neon)、指定浮点ABI(-mfloat-abi=softfp)
#禁用内置函数(-fno-builtin)
#不使用标准C库(-nostdinc)
#指定头文件路径(-I)。
CFLAGS += -g -marm -Wall -O0 -mabi=apcs-gnu -mfpu=neon -mfloat-abi=softfp -fno-builtin \
-nostdinc -I./common/include -I./include
#链接命令
LD = $(CROSS_COMPILE)ld
#C编译器
CC = $(CROSS_COMPILE)gcc
#查看elf文件的符号表信息
NM = $(CROSS_COMPILE)nm
#二进制格式化拷贝
OBJCOPY = $(CROSS_COMPILE)objcopy
#反汇编工具
OBJDUMP = $(CROSS_COMPILE)objdump
#============================================================================#
#OBJSss:使用wildcard函数收集所有的.S(汇编源文件)和.c(C源文件)文件,这些文件来自不同的目录(start/、common/src/、src/以及当前目录)。
OBJSss := $(wildcard start