---
title: 生成BC文件
description: "BC（BitCode）文件是使用LLVM（Low-Level Virtual Machine）编译源代码生成中间文件（IR）的二进制表示，包含了程序编译的中间代码，比源代码文件更加紧凑和高效。DevKit基于LLVM框架，利用BC文件来提高程序的分析效率与分析准确度。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/development/affinityanalyzer/DevKit_Affinity_0018.html
sourcePath: /source/zh/kunpengdevps/development/affinityanalyzer/DevKit_Affinity_0018.html
indexId: 46a3c9959231be3e4fec78be16644cfa1736c5e02eb8bc6abc49ee10e9a5315078
---
# 生成BC文件

BC（BitCode）文件是使用LLVM（Low-Level Virtual Machine）编译源代码生成中间文件（IR）的二进制表示，包含了程序编译的中间代码，比源代码文件更加紧凑和高效。DevKit基于LLVM框架，利用BC文件来提高程序的分析效率与分析准确度。

LLVM是一种开源编译器基础设施，它提供了一个通用的编译器框架和工具链，可以用于构建各种编程语言的编译器、解释器、调试器、代码优化器等。

- 重构版本向量化检查中，使用工程构建工具生成BC文件时，不能指定CC、CXX、FC变量。

- 为了保障功能完整，建议使用DevKit自带的Clang作为编译工具，同时节省Clang编译工具的编译安装时间。
- 若BC文件生成失败，请参见编译器日志或工具日志中的报错信息对源码进行修改适配。部分报错修改请参见《毕昇编译器 用户指南》中的  兼容性说明(https://www.hikunpeng.com/document/detail/zh/kunpengdevps/compilation/ug-bisheng/kunpengbisheng_06_0027.html)
。


#### 前提条件

用于生成BC文件的项目需要确保可以在本地使用LLVM（C/C++编译器使用clang、clang++，Fortran编译器使用flang）编译通过并生成动态库（.so）文件或者可执行文件。

Clang是一个C、C++、Objective-C和Objective-C++编程语言的开源编译器前端。


#### 方法一（推荐使用命令行工具生成BC文件）

在操作之前需要确保已安装亲和分析功能命令行工具，使用命令行BC文件生成(https://www.hikunpeng.com/document/detail/zh/kunpengdevps/development/affinityanalyzer/KunpengDevKitCli_0043.html)功能生成BC文件。


#### 方法二（使用工程构建工具生成BC文件）

使用工程构建工具生成BC文件，如make，cmake等。构建前需修改相关的配置文件，如Makefile。- 替换编译命令：若构建文件中有gcc、g++、gfortran或ld，需要替换成对应的clang、clang++、flang或llvm-link。
- 调整编译选项：修改优化等级“-O0”，增加“-flto -g -fno-inline-functions”。


完成上述操作后，即可通过构建获得BC文件。

- 在构建项目之前，需将GCC编译器替换成LLVM相关的工具。
- 构建时务必替换或增加指定的编译选项，防止部分指令信息缺失，从而影响分析结果准确性。
- 将最终生成的目标文件修改为BC文件。


以make构建项目为例：

1. 确认项目中存在Makefile文件。
  1 2 [root@localhost test]# ls main.c Makefile test.c

2. 修改编译命令并替换编译选项。
  原始的Makefile文件：

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 objects=main.o test.o exe=case CFLAGS = -O2 -DAM_CPU_NUMBER=96 -DMAX_PARALLEL_NUMBER=1 all: $(objects) main.o: ./main.c gcc $(CFLAGS) -c $< -o main.o test.o: ./test.c gcc $(CFLAGS) -c $< -o test.o all: $(exe) case: main.o test.o gcc -lpthread main.o test.o -o case clean: rm -f *.o

  修改后的Makefile文件：

```
objects=main.o test.o
exe=case.bc
CFLAGS = -O0 -flto -g -fno-inline-functions -DAM_CPU_NUMBER=96 -DMAX_PARALLEL_NUMBER=1
all: $(objects)
main.o: ./main.c
clang $(CFLAGS) -c $< -o main.o
test.o: ./test.c
clang $(CFLAGS) -c $< -o test.o
all: $(exe)
case.bc: main.o test.o
llvm-link main.o test.o -o case.bc
clean:
rm -f *.o
```


  修改后的Makefile文件，将编译工具修改为clang，链接生成目标文件的工具改为llvm-link。

3. 完成项目构建。
  1 2 3 4 5 6 [root@localhost test]# make clang -O0 -flto -g -fno-inline-functions -DAM_CPU_NUMBER=96 -DMAX_PARALLEL_NUMBER=1 -c main.c -o main.o clang -O0 -flto -g -fno-inline-functions -DAM_CPU_NUMBER=96 -DMAX_PARALLEL_NUMBER=1 -c test.c -o test.o llvm-link main.o test.o -o case.bc [root@localhost test]# ls case.bc main.c main.o Makefile test.c test.o

  生成的BC文件为case.bc。

4. 打包BC文件。

  a. 创建目录。
    1 mkdir bcfile

  b. 将BC文件拷贝到目录中。
    1 cp case.bc bcfile/

  c. 将BC文件打包。
    1 tar -czvf bcfile.tar.gz bcfile
