|  | @@ -11,9 +11,15 @@ CC = gcc
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  INCLUDE_PATH = -Iinclude  -Icore -Ipaho.mqtt.c/src  -I.
 | 
	
		
			
				|  |  |  #编译参数
 | 
	
		
			
				|  |  | +#-Wall: 启用大多数警告信息 -W: 启用额外的警告 -O2: 启用优化级别2 -g: 生成调试信息 -Wpointer-arith: 启用指针算术警告 -Wstrict-prototypes: 启用严格的函数原型声明
 | 
	
		
			
				|  |  |  CFLAGS = -Wall -W -O2 -g -Wpointer-arith -Wstrict-prototypes $(INCLUDE_PATH)
 | 
	
		
			
				|  |  |  #这个 -Wl,-E 不能少 要不然脚本里require *.so 会报错
 | 
	
		
			
				|  |  | -#MYLIBS = -Wl,-E -lrt -lpthread -lm -lz -ldl  /usr/lib64/mysql/libmysqlclient.so  #-lmysqlclient
 | 
	
		
			
				|  |  | +#-Wl,-E 传递-E选项给链接器,这可以用于各种目的,包括从生成的共享对象中导出所有符号。
 | 
	
		
			
				|  |  | +#-lrt:链接到实时库 -lpthread:链接到线程库 -lm:链接到数学库 -lz:链接到压缩库 -ldl:链接到动态连接库
 | 
	
		
			
				|  |  | +# -L/usr/lib64/mysql:指定 MySQL 客户端库所在的目录。
 | 
	
		
			
				|  |  | +# -lmysqlclient:链接到 MySQL 客户端库。
 | 
	
		
			
				|  |  | +#-Lsolib:指定其他共享库所在的目录。
 | 
	
		
			
				|  |  | +#-Wl,-rpath=solib:设置运行时库搜索路径,包括指定的目录(在这里是 solib)。这确保程序在运行时在该目录中查找共享库。
 | 
	
		
			
				|  |  |  MYLIBS = -Wl,-E  -lrt -lpthread -lm -lz -ldl  -L/usr/lib64/mysql  -lmysqlclient -Lsolib -Wl,-rpath=solib
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -24,16 +30,16 @@ PWD_PATH =$(shell pwd)
 | 
	
		
			
				|  |  |  COMMON_LIB =   libcommon.a   
 | 
	
		
			
				|  |  |  COMMON_LIB_PATH = lib/
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#通用lib库
 | 
	
		
			
				|  |  | +#核心库lib库
 | 
	
		
			
				|  |  |  CORE_LIB = libcore.so
 | 
	
		
			
				|  |  |  CORE_LIB_PATH = core/
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#MQTT 相关文件
 | 
	
		
			
				|  |  | +#MQTT 相关库的源代码路径
 | 
	
		
			
				|  |  |  MQTT_LIB = libpaho-mqtt3a.so
 | 
	
		
			
				|  |  |  MQTT_LIB_SRC = paho.mqtt.c
 | 
	
		
			
				|  |  |  MQTT_LIB_PATH = paho.mqtt.c/src/
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#设置运行目录 及脚本目录
 | 
	
		
			
				|  |  | +#设置生成可执行文件的存放路径
 | 
	
		
			
				|  |  |  RUN_PATH = bin/
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #自定义命令名
 | 
	
	
		
			
				|  | @@ -43,7 +49,8 @@ RM = rm -rf
 | 
	
		
			
				|  |  |  #默认的make目标
 | 
	
		
			
				|  |  |  all:  lib $(TARGET) $(MQTT_LIB) $(CORE_LIB)  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#
 | 
	
		
			
				|  |  | +#进入 lib 目录并执行 make 命令
 | 
	
		
			
				|  |  | +#如果存在main.c则需要重新编译
 | 
	
		
			
				|  |  |  lib:
 | 
	
		
			
				|  |  |  	cd lib && $(MAKE)
 | 
	
		
			
				|  |  |  ifneq (,$(wildcard ./src/main.c))
 | 
	
	
		
			
				|  | @@ -51,22 +58,32 @@ ifneq (,$(wildcard ./src/main.c))
 | 
	
		
			
				|  |  |  	cd src && $(MAKE)
 | 
	
		
			
				|  |  |  endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#目标 生成游戏主程序 并附带copy一些脚本
 | 
	
		
			
				|  |  | +#目标 生成主程序 并附带copy一些脚本
 | 
	
		
			
				|  |  | +#./src/main.o、$(MQTT_LIB)、$(CORE_LIB) 是依赖项。表示在执行该目标之前需要完成这些依赖项的构建
 | 
	
		
			
				|  |  | +#$(wildcard $(CORE_LIB_PATH)/*.c) $(wildcard $(CORE_LIB_PATH)/*.h) 是通配符,表示匹配所有.c 和.h 文件
 | 
	
		
			
				|  |  |  $(TARGET): ./src/main.o $(MQTT_LIB) $(CORE_LIB)  $(wildcard $(CORE_LIB_PATH)/*.c) $(wildcard $(CORE_LIB_PATH)/*.h) 
 | 
	
		
			
				|  |  |  	@# 后面的lib库在调整先后位置后可能导致编译出错哦
 | 
	
		
			
				|  |  |  	$(CP) $(CORE_LIB_PATH)$(CORE_LIB) $(SO_LIB)
 | 
	
		
			
				|  |  | -	$(CP) $(MQTT_LIB_PATH)$(MQTT_LIB) $(SO_LIB) 
 | 
	
		
			
				|  |  | +	$(CP) $(MQTT_LIB_PATH)$(MQTT_LIB) $(SO_LIB)
 | 
	
		
			
				|  |  | +	@# 使用 gcc 编译器将目标文件、通用库、库路径和其他选项链接为最终的可执行程序
 | 
	
		
			
				|  |  |  	$(CC) $(CFLAGS) ./src/main.o $(COMMON_LIB_PATH)$(COMMON_LIB)  $(MYLIBS)  $(SO_LIB)/$(CORE_LIB)  $(SO_LIB)/$(MQTT_LIB)  -o $(TARGET)
 | 
	
		
			
				|  |  | +	@# 将生成的可执行程序复制到运行目录
 | 
	
		
			
				|  |  |  	$(CP) $(TARGET) $(RUN_PATH)
 | 
	
		
			
				|  |  | +	@# 删除临时目录下的 lib 目录,并将 lib 目录复制到运行目录
 | 
	
		
			
				|  |  |  	$(RM) $(RUN_PATH)/$(SO_LIB) && $(CP)   $(SO_LIB) $(RUN_PATH)
 | 
	
		
			
				|  |  | +	@# 删除当前目录下生成的可执行程序
 | 
	
		
			
				|  |  |  	$(RM) $(TARGET)
 | 
	
		
			
				|  |  |  	@echo -e "\\033[32m $(TARGET) is OK and Move to DIR: $(RUN_PATH)  \\033[0m"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  # MQTT_LIB 的生成方法
 | 
	
		
			
				|  |  | +# 获取指定路径下所有的 .c 文件和 .h 文件
 | 
	
		
			
				|  |  | +# 进入 $(MQTT_LIB_SRC) 目录,然后执行 make 命令
 | 
	
		
			
				|  |  |  $(MQTT_LIB): $(wildcard $(MQTT_LIB_SRC)/src/*.c) $(wildcard $(MQTT_LIB_SRC)/src/*.h)
 | 
	
		
			
				|  |  |  		cd $(MQTT_LIB_SRC)  && $(MAKE) 
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +# CORE_LIB 的生成方法
 | 
	
		
			
				|  |  | +# 获取指定路径下所有的 .c 文件和 .h 文件
 | 
	
		
			
				|  |  | +# 进入 $(CORE_LIB_PATH) 目录,然后执行 make 命令。
 | 
	
		
			
				|  |  |  $(CORE_LIB): $(wildcard $(CORE_LIB_PATH)/*.c) $(wildcard $(CORE_LIB_PATH)/*.h)
 | 
	
		
			
				|  |  |  		cd $(CORE_LIB_PATH) && $(MAKE)
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -98,4 +115,4 @@ endif
 | 
	
		
			
				|  |  |  ifeq "$(HOME)" "/home/bighead"
 | 
	
		
			
				|  |  |  	find . -name cscope\.*  -exec rm -f {} \;
 | 
	
		
			
				|  |  |  	find . -name tags -exec rm -f {} \;
 | 
	
		
			
				|  |  | -endif
 | 
	
		
			
				|  |  | +endif
 |