GCC编译文件模板MakeFile

# Makefile for compiling TestCode

# 设置 GCC 编译器的路径(根据实际情况进行调整)
GCC_PATH := E:/gnu/gcc-arm-none-eabi-5_4-20160926/bin/
GCC := $(GCC_PATH)arm-none-eabi-gcc-5.4.1
AR := $(GCC_PATH)arm-none-eabi-ar

# 编译选项
CFLAGS := -Ofast -DKERNEL -D__ZEPHYR__=1 -c -g -std=c99

# 链接选项
CMACRO := -nostartfiles -nodefaultlibs -nostdlib -static -r

# 目录设置
DIR_INC := ./TestCode
DIR_SRC := ./TestCode
DIR_OBJ := ./Obj
OUTPUT := ./output

# Files to be compiled
SRC := $(wildcard $(DIR_SRC)/*.c)
OBJS := $(SRC:$(DIR_SRC)/%.c=$(DIR_OBJ)/%.o)
BUILD := $(OBJS:$(DIR_OBJ)/%.o=./%)

# 不自动删除 *.o 文件
.SECONDARY: $(OBJS)

# 目标:创建静态库
TARGET_STATIC := TestCode.a
$(TARGET_STATIC): $(OBJS)
	@echo "Creating $(TARGET_STATIC)"
	@mkdir -p $(OUTPUT)
	@rm -rf $(OUTPUT)/*.*
	@$(AR) -rc $(OUTPUT)/$(TARGET_STATIC) $(OBJS)
	@cp $(DIR_INC)/TestCode.h $(OUTPUT)

# 目标:创建动态库
TARGET_SHARED := libTestCode.so
$(TARGET_SHARED): $(OBJS)
	@echo "Creating $(TARGET_SHARED)"
	@mkdir -p $(OUTPUT)
	@rm -rf $(OUTPUT)/*.*
	@$(GCC) $(CFLAGS) $(CMACRO) -shared -o $(OUTPUT)/$(TARGET_SHARED) $(OBJS)
	@cp $(DIR_INC)/TestCode.h $(OUTPUT)

# 目标:编译每个 *.c 文件为 *.o 文件
$(DIR_OBJ)/%.o: $(DIR_SRC)/%.c
	@echo + GCC $<
	@mkdir -p $(DIR_OBJ)
	@$(GCC) $(CFLAGS) $(CMACRO) -I $(DIR_INC) -c -o $@ $^

# 目标:编译所有源文件
all: $(BUILD)

# 目标:清理
.PHONY: clean
clean:
	rm -rf $(OBJS) $(TARGET_STATIC) $(TARGET_SHARED)
	

详细解释Makefile:

  1. # Makefile for compiling TestCode:这是注释行,用于描述 Makefile 的用途。

  2. GCC_PATH := E:/gnu/gcc-arm-none-eabi-5_4-20160926/bin/:定义了一个变量 GCC_PATH,用于存储 GCC 编译器的路径。

  3. GCC := $(GCC_PATH)arm-none-eabi-gcc-5.4.1:定义了一个变量 GCC,它是完整的 GCC 编译器路径。

  4. AR := $(GCC_PATH)arm-none-eabi-ar:定义了一个变量 AR,它是静态库生成工具 ar 的路径。

  5. CFLAGS := -Ofast -DKERNEL -D__ZEPHYR__=1 -c -g -std=c99:定义了一个变量 CFLAGS,它包含了编译选项,如优化级别、宏定义、只编译不链接、生成调试信息和使用 C99 标准。

    • -Ofast:启用最高级别的优化。
    • -DKERNEL:定义了一个宏 KERNEL
    • -D__ZEPHYR__=1:定义了一个宏 __ZEPHYR__ 并赋值为 1。
    • -c:只编译源文件,不进行链接。
    • -g:生成调试信息。
    • -std=c99:使用 C99 标准。
  6. CMACRO := -nostartfiles -nodefaultlibs -nostdlib -static -r:定义了一个变量 CMACRO,它包含了链接选项,如不使用默认启动文件、不使用默认库和生成静态库。

    • -nostartfiles:不使用默认启动文件。
    • -nodefaultlibs:不使用默认库。
    • -nostdlib:不使用标准库。
    • -static:生成静态库。
    • -r:生成可重定位目标文件。
  7. DIR_INC := ./TestCode:定义了一个变量 DIR_INC,它存储了头文件目录的路径。

  8. DIR_SRC := ./TestCode:定义了一个变量 DIR_SRC,它存储了源文件目录的路径。

  9. DIR_OBJ := ./Obj:定义了一个变量 DIR_OBJ,它存储了目标文件目录的路径。

  10. OUTPUT := ./output:定义了一个变量 OUTPUT,它存储了输出目录的路径。

  11. SRC = $(wildcard $(DIR_SRC)/*.c):使用通配符获取了源文件目录下所有的 .c 文件列表,并将其存储在变量 SRC 中。

  12. OBJS := $(SRC:$(DIR_SRC)/%.c=$(DIR_OBJ)/%.o):将源文件列表中的每个 .c 文件替换为目标文件列表中的 .o 文件。

  13. .SECONDARY: $(OBJS):这是一个特殊的目标,用于防止自动删除中间文件(.o 文件)。

  14. TARGET_STATIC := TestCode.a:定义了一个变量 TARGET_STATIC,它存储了静态库的名称。

  15. $(TARGET_STATIC): $(OBJS):这是一个规则,表示生成静态库的目标文件是 $(TARGET_STATIC),依赖于目标文件列表 $(OBJS)

  16. @echo "Creating $(TARGET_STATIC)":输出一条消息,表示正在创建静态库。

  17. @mkdir -p $(OUTPUT):创建输出目录。

  18. @rm -rf $(OUTPUT)/*.*:删除输出目录中的所有文件。

  19. @$(AR) -rc $(OUTPUT)/$(TARGET_STATIC) $(OBJS):使用 ar 工具创建静态库。

  20. @cp $(DIR_INC)/TestCode.h $(OUTPUT):将头文件复制到输出目录。

  21. 类似地,后面的规则和命令用

(1) Makefile基础 - 廖雪峰的官方网站. https://www.liaoxuefeng.com/wiki/1599771213037600/1599771942846497.
(2) GNU Make - Makefile 是如何解析的 - Runebook.dev. https://bing.com/search?q=makefile+%e9%80%90%e8%a1%8c%e8%a7%a3%e9%87%8a.
(3) GNU Make - Makefile 是如何解析的 - Runebook.dev. https://runebook.dev/zh/docs/gnu_make/parsing-makefiles.
(4) makefile 常规+进阶使用方法(附代码示例)_mkf文件-CSDN博客. https://blog.csdn.net/m0_66766911/article/details/123563601.

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_SimpleLife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值