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

能否将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:24:03