我有一个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
然而,似乎正在发生的事情是,当我链接应用程序的位代码时,MyLibrary.bc的全部内容似乎都包含在结果中。因此,最终链接需要解析我实际上没有使用的库组件所做的引用。
我想要做的是从MyLibrary.bc中提取我的应用程序所需的位代码文件。我看到有一个llvm-ar程序,但在阅读它时,我不会觉得它会有所帮助。我猜我可以将库与llvm-ar结合使用而不是llvm-link,但我无法弄明白。我希望我所需要的只是一点推力:)
答案 0 :(得分:4)
编辑:实际上它是ar使它起作用。
迟到但仍可能与某人有关,我们使用ar
和ld.gold
与LLVM插件链接bitcode:
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只需要符号。