(图一)
(图2)
makefile和.sh都是字符串脚本语言,因此其一切内容都是字符和字符串,没有数字的概念;不要被c语言误导了,不要认为"中的才是字符串", 无"的就是数值";比如ifneq ($(SRCARCH),$(SUBARCH)) 就是比较这两个变量对应的字符串是否相同,而不是比较数值;因此ifneq ($(SRCARCH),0)就是看变量对应的字符串是不是字符0,而不是看变量的数值是否等于0,如果有点绕就理解下ifneq ($(SRCARCH), y)的形式。
makefile中用于判断和循环(for..in)的demo,makefile相当于make工具的源码,可以控制make工具做很多事,并非只能编译代码
Makefile 循环遍历子文件夹的示例:
1 CC = $(CROSS)gcc 2 CXX = $(CROSS)g++ 3 DEBUG = 4 CFLAGS = $(DEBUG) -Wall -c 5 MV = mv -f 6 RM = rm -rf 7 LN = ln -sf 8 9 TARGET = classify 10 11 TOP_PATH = $(shell pwd) 12 SRC_PATH = $(TOP_PATH)/src 13 MOD_PATH = $(TOP_PATH)/modules 14 MOD_LIB_PATH = $(MOD_PATH)/lib 15 MOD_INC_PATH = $(MOD_PATH)/include 16 DIRS = $(shell find $(SRC_PATH) -maxdepth 3 -type d) 17 FILES = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp)) 18 19 ########################################################## 20 # modules 21 ########################################################## 22 modules = 23 MODULES_PATH = $(foreach m, $(modules), $(MOD_PATH)/$(m)) 24 25 ########################################################## 26 # srcs 27 ########################################################## 28 SRCS_CPP += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp)) 29 SRCS_CC += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cc)) 30 SRCS_C += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c)) 31 32 ########################################################## 33 # objs 34 ########################################################## 35 OBJS_CPP = $(patsubst %.cpp, %.o, $(SRCS_CPP)) 36 OBJS_CC = $(patsubst %.cc, %.o, $(SRCS_CC)) 37 OBJS_C = $(patsubst %.c, %.o, $(SRCS_C)) 38 39 ########################################################## 40 # paths 41 ########################################################## 42 INC_PATH += -I$(MOD_INC_PATH) 43 INC_PATH += -I$(MOD_PATH) 44 LIB_PATH += -L$(TOP_PATH)/lib 45 LIB_PATH += -L$(MOD_LIB_PATH) 46 47 ########################################################## 48 # libs 49 ########################################################## 50 51 ########################################################## 52 # building 53 ########################################################## 54 all:$(TARGET) 55 56 $(TARGET) : $(OBJS_CPP) $(OBJS_CC) $(OBJS_C) 57 @ for i in $(MODULES_PATH); \ 58 do \ 59 make -C $$i; \ 60 done 61 62 @ $(CXX) $^ -o $@ $(LIB_PATH) $(LIBS) 63 @ echo Create $(TARGET) ok... 64 65 $(OBJS_CPP):%.o : %.cpp 66 $(CXX) $(CFLAGS) $< -o $@ $(INC_PATH) 67 68 $(OBJS_CC):%.o : %.cc 69 $(CXX) $(CFLAGS) $< -o $@ $(INC_PATH) 70 71 $(OBJS_C):%.o : %.c 72 $(CXX) $(CFLAGS) $< -o $@ $(INC_PATH) 73 74 .PHONY : clean show 75 clean: 76 @ $(RM) $(TARGET) $(OBJS_CPP) $(OBJS_CC) $(OBJS_C) 77 @ for i in $(MODULES_PATH); \ 78 do \ 79 make clean -C $$i; \ 80 done 81 @echo clean all...
82 show:
83 @echo OBJS_C = $(OBJS_C)
84 @echo OBJS_CC = $(OBJS_CC)
(图3)
图3 讲的是pps的概念,发送端的pps帧会和gprmc帧同一时刻发出,但传输需要时间,传输的耗时会体现在pps上,如上图的250ms;因此接收端的真实时间应该是由收到的gprmc中解析出的时间在加上pps的偏移时间所组成,gprmc中的时间精度是秒。
(图4)
图4 讲的是 2 进制单位和 10 进制单位对数据的描述, 1Ki = 2 ^ 10 = 1024 而 1K = 10 ^ 3 = 1000
链接时目标o文件必须放在库lib文件前,即$(LD) $(LDFLAGS) $^ $(LDLIBS) -o $(TARGET).elf (其中 LDLIBS = libm.a + libc.a + ...)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现