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