11

我有一个 C++ 项目,它使用我也编写的 C++ 库。我正在使用 clang++ 3.3 来构建一切。库中的每个文件都编译为

clang++ -c -O -emit-llvm somefile.cpp -o somefile.bc

然后我使用 llvm-link 将所有库 *.bc 文件组合成一个位代码文件,如下所示

llvm-link -o MyLibrary.bc somefile.bc someotherfile.bc etc.bc

我将其概念化为类似于创建目标文件的存档,但根据事情的行为方式,我认为这不是真的。

然后我使用与上述类似的命令编译我的项目的源文件。然后我(再次)使用 llvm-link 将这些以及库位代码文件组合成一个像这样的位代码文件

llvm-link -o app.bc1 main.bc x.bc y.bc path/to/MyLibrary.bc

接下来我将 app.bc1 编译为本机目标文件

llc -filetype=obj app.bc1 -o app.o

最后,我再次使用 clang++ 来链接这个本地对象文件(以及我需要的其他本地库,例如 C++ 标准库等)

clang++ app.o -o app

但是,似乎正在发生的事情是,当我 llvm-link 应用程序的位代码时,MyLibrary.bc 的全部内容似乎都包含在结果中。因此,最终的链接需要解决我实际上没有使用的库组件所做的引用。

我想做的是从 MyLibrary.bc 中仅提取我的应用程序需要的位代码文件。我看到有一个 llvm-ar 程序,但在阅读它时,我没有得到它在这里会有所帮助的印象。我猜我可以将这个库与 llvm-ar 而不是 llvm-link 结合起来,但我想不通。我希望我所需要的只是一点点推动:)

4

1 回答 1

4

编辑:实际上是 ar 使它起作用。

有点晚了,但仍然可能与某人有关,我们使用arLLVMld.gold插件来链接位码:

ar r --plugin /usr/lib64/llvm/LLVMgold.so library.a <files...>
ld.gold --plugin /usr/lib64/llvm/LLVMgold.so -plugin-opt emit-llvm  main.bc library.a

当然,LLVMgold.so 的路径可能会有所不同。这样产生的 .bc 只需要符号。

于 2014-06-21T15:20:12.483 回答