You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Makefile中使用cflow生成调用图?参考官方方法无输出

Makefile集成cflow生成调用图无输出问题

问题描述

我希望通过Makefile生成程序对象的调用图。我已阅读cflow官方手册中关于在Makefile中使用cflow方法的章节,但说明不够具体。我尝试按照手册操作,却未得到任何输出结果。
我已完成的操作(测试时使用cflow-1.6源代码):

  1. 在源码根路径.../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)
  1. 在源码根路径.../cflow-1.6/下执行./configure命令;
  2. 在源码根路径.../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张庆昊

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 17:15:03