能否将LLVM生成的.o作为依赖编译C文件得到其IR表示
操作指南与原理解释
为什么你的原有命令执行失败
你执行的clang -c -emit-llvm input.o funcdefs.c存在两个核心问题:
-c参数指定仅执行编译流程(预处理→编译→生成IR/目标文件),不触发链接逻辑,因此输入的input.o目标文件完全不会被解析,无法提供符号定义- C代码编译为IR的阶段,仅需要符号的类型声明即可通过编译,不需要符号的实际定义,编译器不会从目标文件/bitcode中自动提取符号声明信息,因此就算传入了
input.o也无法解决符号未识别的报错
正确实现步骤
第一步:补充符号声明
你只需要在funcdefs.c头部(或引入的头文件中)添加input.bc中导出的函数、全局变量的类型声明即可,不用手动引入定义。如果不想手动整理声明,可以通过以下命令导出input.bc的可读IR,直接提取对应声明:
llvm-dis input.bc -o input.ll
打开生成的input.ll文件,拷贝所有declare开头的函数声明、@开头的全局变量声明,转换为C语法的声明后添加到funcdefs.c中即可。
第二步:编译生成funcdefs的IR文件
执行以下命令即可完成编译,不会再报符号未识别错误:
clang -c -emit-llvm funcdefs.c -o funcdefs.bc
如果需要可读的IR格式,可以再加一步转码:
llvm-dis funcdefs.bc -o funcdefs.ll
可选:合并两份Bitcode
如果你后续需要将两份bitcode合并为一个完整的IR文件,可以使用llvm-link工具完成:
llvm-link input.bc funcdefs.bc -o combined.bc
内容的提问来源于stack exchange,提问作者Sigterm
相关产品推荐
相关产品推荐

