GCC Make能否检测源文件中已定义符号及宏定义的值?
在Makefile中检测源文件的符号与宏定义值
当然可以!不过得借助GCC的预处理器功能,因为Make本身没法直接解析C源文件里的符号和宏定义。下面分两种情况给你详细讲:
1. 检测源文件中是否存在某个已定义符号
要判断源文件(或其包含的头文件)里是否定义了某个宏,你可以用GCC的-E -dM参数,这个组合会让预处理器输出所有有效的宏定义,然后用grep过滤目标宏即可。
示例Makefile片段:
# 定义一个函数,检查指定文件中是否存在目标宏 # 参数1:要检查的源文件路径 CHECK_SYMBOL = $(shell gcc -E -dM $(1) | grep -q '^#define DEFINED_BLAH_BLAH' && echo 1 || echo 0) # 调用函数检查foo.c ifeq ($(call CHECK_SYMBOL, foo.c), 1) $(info DEFINED_BLAH_BLAH 已在foo.c(或其包含的头文件)中定义) else $(info DEFINED_BLAH_BLAH 未定义) endif
如果只需要检查源文件本身(不包含头文件),可以直接用grep扫描源文件:
CHECK_SYMBOL_LOCAL = $(shell grep -q '^#define DEFINED_BLAH_BLAH' $(1) && echo 1 || echo 0)
2. 检测宏定义是否等于指定值
你原来写的ifeq (DEFINED_BLAH_BLAH,3)是行不通的——因为Make会把DEFINED_BLAH_BLAH当成自己的变量,而不是C源文件里的宏。正确的做法是先提取宏的实际值,再和目标值比较。
示例Makefile片段:
# 定义函数,提取指定文件中目标宏的值 GET_MACRO_VALUE = $(shell gcc -E -dM $(1) | grep '^#define DEFINED_BLAH_BLAH' | awk '{print $$3}') # 获取foo.c中DEFINED_BLAH_BLAH的值 CURRENT_VAL = $(call GET_MACRO_VALUE, foo.c) # 比较值是否等于3 ifeq ($(CURRENT_VAL), 3) @echo "DEFINED_BLAH_BLAH 等于3" else @echo "DEFINED_BLAH_BLAH 不等于3,当前值是:$(CURRENT_VAL)" endif
处理特殊情况
如果宏定义带括号(比如#define DEFINED_BLAH_BLAH (3)),可以用sed去掉括号:
GET_MACRO_VALUE = $(shell gcc -E -dM $(1) | grep '^#define DEFINED_BLAH_BLAH' | sed 's/^#define DEFINED_BLAH_BLAH //; s/[()]//g')
如果宏是字符串值(比如#define DEFINED_BLAH_BLAH "3"),比较时要带上引号:
ifeq ($(CURRENT_VAL), "3") # ... endif
内容的提问来源于stack exchange,提问作者joe blogs
相关产品推荐
相关产品推荐

