我有一个 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 结合起来,但我想不通。我希望我所需要的只是一点点推动:)