Makefile数组变量使用问题:通过已有变量生成编译宏失败
解决Makefile中从变量提取内容生成宏定义的问题
首先,你遇到的核心问题是Makefile并不支持像编程语言那样用[下标]直接访问字符串的单个字符——你写的$(MYVARIABLE1[7])会被Makefile解析为一个名为MYVARIABLE1[7]的变量(而这个变量根本没定义),展开后是空值,导致MYVARIABLE2的宏定义出现语法错误,最终编译失败。
下面是可行的解决方案,通过Makefile内置的字符串处理函数来提取你需要的版本号部分:
# 原始变量 MYVARIABLE1 = HELLO 4.5.6 # 第一步:提取MYVARIABLE1中的版本号部分(第二个空格分隔的单词) VERSION_PART = $(word 2, $(MYVARIABLE1)) # 第二步:将版本号按点拆分,分别取出主版本、次版本、修订版本号 V_MAJOR = $(word 1, $(subst ., , $(VERSION_PART))) V_MINOR = $(word 2, $(subst ., , $(VERSION_PART))) V_PATCH = $(word 3, $(subst ., , $(VERSION_PART))) # 第三步:构造MYVARIABLE2,拼接成目标十六进制格式 MYVARIABLE2 = "{0x95,0x0$(V_MAJOR),0x0$(V_MINOR),0x0$(V_PATCH),' ','A','A'}" # 追加到编译标志 CFLAGS += -DMYVARIABLE2=$(MYVARIABLE2)
代码细节说明:
$(word 2, $(MYVARIABLE1)):从MYVARIABLE1的空格分隔单词中取出第二个,也就是4.5.6;$(subst ., , $(VERSION_PART)):把版本号里的点替换成空格,将4.5.6转换成4 5 6;- 再用
$(word N, ...)分别取出每个版本号数字,最后拼接成你需要的十六进制格式; - 这样生成的
MYVARIABLE2和你之前硬编码的内容完全一致,编译时宏定义不会有语法问题。
额外适配说明:
如果你的版本号可能出现多位数(比如HELLO 10.12.8),这个方案依然有效——0x0$(V_MAJOR)会变成0x010,这是合法的十六进制写法,C编译器可以正常解析。
内容的提问来源于stack exchange,提问作者Sharky
相关产品推荐
相关产品推荐

