如何从多个C文件生成仅包含main.c所用定义的单个C文件
问题解答
现成实现方案
是存在这类可实现按需提取的工具的:
- 基于Clang前端的定制工具:利用libclang的语法解析能力可以精准识别所有用到的符号,现有不少开源小工具已经实现了该能力,不会直接全量引入所有引用文件的内容,仅保留实际用到的符号定义和实现。
- 定制版的C代码合并脚本:普通的amalgamate类脚本默认是全量合并,但增加符号依赖分析逻辑的版本即可满足你的需求。
自行开发脚本的实现思路
你可以按照以下步骤开发符合要求的脚本:
- 第一步:预处理输入文件
先解析main.c的引入头文件,将<>包裹的系统头直接保留到输出文件中,将""包裹的本地头文件和对应的.c实现文件标记为待分析文件。 - 第二步:收集主文件依赖符号
解析main.c的抽象语法树(AST),将所有用到的结构体、typedef、函数、全局变量名全部存入依赖符号集合。 - 第三步:递归追溯全量依赖
遍历所有待分析的本地头、实现文件:- 优先捞取依赖集合中符号对应的类型定义、函数声明,若这些定义中还用到其他未收录的本地符号,将新符号也加入依赖集合
- 再捞取依赖集合中函数、全局变量对应的实现代码,同样递归检查实现中用到的本地符号并补充到依赖集合
- 第四步:按序生成最终文件
先输出保留的系统头语句,再按「类型定义→函数声明→函数实现」的顺序输出所有提取到的内容,最后输出main.c中除了本地#include语句之外的剩余代码即可。
如果你不需要兼容特别复杂的C语法特性,也可以简化实现:不需要做完整AST解析,仅用正则匹配符号定义、引用,就能覆盖大多数简单场景的需求。
内容的提问来源于stack exchange,提问作者lightxbulb
相关产品推荐
相关产品推荐

