这是一个智慧中控项目中的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
-