2025年3月16日 星期日 甲辰(龙)年 月十五 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Makefile

Makefile文件结构解析

时间:11-24来源:作者:点击数:23

前言

这是一个智慧中控项目中的Makefile文件,用于配置编译选项和依赖关系。

现在这里拆解Makefile文件的内容结构,便以理解它们之间的关系。

来源链接:交叉编译章节链接

Makefile基础知识链接:Makefile基础知识链接

一、解析版本

一、这个Makefile文件定义了编译器gcc、源文件SRC、头文件INC、目标文件OBJ、编译选项CFLAGS 和链接选项LDFLAGS、LIBS等;

二、规定了临时目标文件OBJ、最终目标可执行文件TARGET的生成规则;

三、以及伪目标clean、compile、debug的执行规则。

  • #—— —— —— —— —— 【一、定义】—— —— —— —— ——
  • CC := aarch64-linux-gnu-gcc #定义编译器
  • #———— 1.设置临时目标文件的名称。
  • #在生成(最终目标文件 TARGET )前,
  • #我们要生成(临时目标文件 OBJ ),这是生成目标文件所需要的依赖文件
  • #这里先把(临时目标文件 OBJ )路径名字都定义好,真正的实现在下面的目标(主程序),有实现的规则。
  • SRC := $(shell find src -name "*.c") #查找src所有.c文件名 (源文件列表)
  • OBJ := $(subst src/,obj/,$(SRC:.c=.o)) #把刚刚的查找到的SRC所有的.c文件名替换为.o文件名,
  • #并将路径从src/替换成obj/ (把源文件列表转换为目标文件列表)
  • #———— 2.设置最终生成的可执行文件的名称。
  • #本项目中想要生成的(最终目标文件 TARGET )
  • #这里也一样先把(最终目标文件 TARGET )路径名字都定义好,真正的实现在下面的目标(主程序),有实现的规则。
  • TARGET=obj/garbage
  • #———— 3.头文件的路径
  • INC := ./inc \ #原始我们自己封装的头文件路径
  • ./3rd/usr/local/include \ #编译wiringOP库得到的库文件所在路径
  • ./3rd/usr/include \ #这个包括下面这些都是步骤4解压出来的
  • ./3rd/usr/include/python3.10 \
  • ./3rd/usr/include/aarch64-linux-gnu/python3.10 \
  • ./3rd/usr/include/aarch64-linux-gnu
  • #设置编译器的选项 —— 头文件的路径,全部加个-I
  • #在命令行中输入命令需要附加头文件路径时候要加-I
  • CFLAGS := $(foreach item, $(INC),-I$(item)) # -I./inc -I./3rd/usr/local/include
  • #———— 4.库文件的路径 (这个工程依赖的第三方头文件和库)
  • #在香橙派直接编译智能垃圾桶代码的时候,因为这些库 -lwiringPi -lpython3.10 香橙派本来就有,
  • #在香橙派系统的默认库路径下,所以直接在命令后面加具体的库就行 -lwiringPi -lpython3.10 ,
  • #( gcc -o garbagetest garbagetest.c garbage.c garbage.h -I /usr/include/python3.10 -lwiringPi -l python3.10 )
  • #但是在宿主机(PC X86)交叉编译项目的时候,这些库宿主机是没有的,
  • #所以需要把用到的库,它们的路径都写出来加上-L ,提供给编译器。
  • #在编译这些库的时候,可以让编辑器去这些库的路径下去找到这些库
  • # -L./3rd/usr/local/libs -L... -lwiringPi -lpython3.10 。
  • LIBS_PATH := ./3rd/usr/local/lib \ #编译wiringOP库得到的库文件路径
  • ./3rd/lib/aarch64-linux-gnu \ #这个包括下面这些都是步骤4解压出来的
  • ./3rd/usr/lib/aarch64-linux-gnu \
  • ./3rd/usr/lib/python3.10
  • #设置链接器的选项 —— 库文件的路径,全部加个-L
  • #在命令行中输入命令需要附加库文件的路径时要加个-L
  • LDFLAGS := $(foreach item, $(LIBS_PATH),-L$(item)) # -L./3rd/usr/local/libs
  • #———— 5.设置需要用的具体的库 —— 链接器会从上面的库路径去找这几个库链接
  • LIBS := -lwiringPi -lpython3.10 -pthread -lexpat -lz -lcrypt
  • #—— —— —— —— —— 【二、目标(主程序)真正生成文件的地方】—— —— —— —— —
  • #规则 —— 从源文件生成目标文件(临时文件)
  • #OBJ变量下所有叫obj文件的生成规则
  • obj/%.o:src/%.c
  • mkdir -p obj
  • $(CC) -o $@ -c $< $(CFLAGS)
  • #规则 —— 从目标文件生成最终可执行文件(最终文件)
  • $(TARGET) :$(OBJ)
  • $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) $(LIBS)
  • #—— —— —— —— ——【三、伪目标】—— —— —— —— ——
  • #伪目标 —— 编译项目。
  • compile : $(TARGET)
  • #伪目标 —— 清理项目。
  • clean:
  • rm $(TARGET) obj $(OBJ) -rf
  • #伪目标 —— 调试,定义一个伪目标来打印变量的值以进行调试。
  • debug:
  • echo $(CC)
  • echo $(SRC)
  • echo $(INC)
  • echo $(OBJ)
  • echo $(TARGET)
  • echo $(CFLAGS)
  • echo $(LDFLAGS)
  • echo $(LIBS)
  • #定义伪目标属性 —— 将上面的伪目标标记为伪目标,以防止Makefile将它们视为文件名。
  • .PHONY: clean compile debug

二、原版本

  • CC := aarch64-linux-gnu-gcc
  • SRC := $(shell find src -name "*.c")
  • INC := ./inc \
  • ./3rd/usr/local/include \
  • ./3rd/usr/include \
  • ./3rd/usr/include/python3.10 \
  • ./3rd/usr/include/aarch64-linux-gnu/python3.10 \
  • ./3rd/usr/include/aarch64-linux-gnu
  • OBJ := $(subst src/,obj/,$(SRC:.c=.o))
  • TARGET=obj/garbage
  • CFLAGS := $(foreach item, $(INC),-I$(item)) # -I./inc -I./3rd/usr/local/include
  • LIBS_PATH := ./3rd/usr/local/lib \
  • ./3rd/lib/aarch64-linux-gnu \
  • ./3rd/usr/lib/aarch64-linux-gnu \
  • ./3rd/usr/lib/python3.10
  • LDFLAGS := $(foreach item, $(LIBS_PATH),-L$(item)) # -L./3rd/usr/local/libs
  • LIBS := -lwiringPi -lpython3.10 -pthread -lexpat -lz -lcrypt
  • obj/%.o:src/%.c
  • mkdir -p obj
  • $(CC) -o $@ -c $< $(CFLAGS)
  • $(TARGET) :$(OBJ)
  • $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) $(LIBS)
  • compile : $(TARGET)
  • clean:
  • rm $(TARGET) obj $(OBJ) -rf
  • debug:
  • echo $(CC)
  • echo $(SRC)
  • echo $(INC)
  • echo $(OBJ)
  • echo $(TARGET)
  • echo $(CFLAGS)
  • echo $(LDFLAGS)
  • echo $(LIBS)
  • .PHONY: clean compile debug
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
上一篇:Makefile规则和使用 下一篇:很抱歉没有了
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐