如何在Makefile中使用cflow生成调用图?参考官方方法无输出
Makefile集成cflow生成调用图无输出问题
问题描述
我希望通过Makefile生成程序对象的调用图。我已阅读cflow官方手册中关于在Makefile中使用cflow方法的章节,但说明不够具体。我尝试按照手册操作,却未得到任何输出结果。
我已完成的操作(测试时使用cflow-1.6源代码):
- 在源码根路径
.../cflow-1.6/下的Makefile.am中添加如下代码:
EXTRA_DIST=cflow.rc CFLOW_FLAGS=-i^s cflow_CFLOW_INPUT=$(cflow_OBJECTS:.$(OBJEXT)=.c) cflow.cflow: $(cflow_CFLOW_INPUT) cflow.rc Makefile CFLOWRC=$(top_srcdir)/src/cflow.rc \ cflow -ocflow.cflow $(CFLOW_FLAGS) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) \ $(cflow_CFLOW_INPUT)
- 在源码根路径
.../cflow-1.6/下执行./configure命令; - 在源码根路径
.../cflow-1.6/下执行make命令。
问题原因与修复方案
1. 自定义目标未纳入默认执行流程
Automake默认的构建入口为make all,你新增的cflow.cflow属于独立自定义目标,直接执行make不会触发该规则。
- 两种修复方式:
- 手动触发:直接执行
make cflow.cflow即可生成调用图 - 加入默认构建流程:在当前
Makefile.am中新增all-local: cflow.cflow规则,执行make时会自动完成调用图生成
- 手动触发:直接执行
2. 变量定义位置错误导致输入文件为空
cflow_OBJECTS是Automake为编译cflow可执行文件自动生成的内置变量,仅在定义了bin_PROGRAMS = cflow的目录下存在。cflow-1.6的可执行文件编译逻辑位于src/目录下的Makefile.am,你将规则加到根目录的Makefile.am中时,cflow_OBJECTS为空,导致cflow_CFLOW_INPUT无有效输入文件,cflow执行后自然无输出。
- 修复:将上述cflow相关规则全部移动到
src/目录下的Makefile.am中
3. 缩进格式错误
Makefile中规则的命令行必须使用Tab键缩进,不能用空格。如果代码中使用空格缩进,执行make时会直接报错跳过该目标。
- 检查:使用编辑器显示不可见字符,确认命令行前的缩进为Tab而非空格
4. 输出文件路径易混淆
规则中-ocflow.cflow的输出路径为当前执行make的目录,若规则放在src/目录下,生成的cflow.cflow文件会直接输出到src/路径下,不要误在根目录查找。
内容的提问来源于stack exchange,提问作者0811张庆昊
相关产品推荐
相关产品推荐

