您当前的位置:首页 > 计算机 > 编程开发 > Makefile

Makefile文件结构解析

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

前言

这是一个智慧中控项目中的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规则和使用 下一篇:很抱歉没有了
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐