我有一个C++项目,它使用我也写过的C++库.我正在使用clang ++ 3.3来构建一切.库中的每个文件都编译为
clang++ -c -O -emit-llvm somefile.cpp -o somefile.bc
Run Code Online (Sandbox Code Playgroud)
然后我使用llvm-link将所有库*.bc文件组合成一个像这样的位代码文件
llvm-link -o MyLibrary.bc somefile.bc someotherfile.bc etc.bc
Run Code Online (Sandbox Code Playgroud)
我将其概念化为类似于创建目标文件的存档,但我不认为这是基于事物的行为方式.
然后我使用与上面相似的命令编译项目的源文件.然后我使用llvm-link(再次)将这些以及库位代码文件与这样的单个位代码文件组合在一起
llvm-link -o app.bc1 main.bc x.bc y.bc path/to/MyLibrary.bc
Run Code Online (Sandbox Code Playgroud)
接下来,我将app.bc1编译为本机对象文件
llc -filetype=obj app.bc1 -o app.o
Run Code Online (Sandbox Code Playgroud)
最后我再次使用clang ++链接这个本机对象文件(和我需要的其他本机库,比如C++标准库等)
clang++ app.o -o app
Run Code Online (Sandbox Code Playgroud)
然而,似乎正在发生的事情是,当我链接应用程序的位代码时,MyLibrary.bc的全部内容似乎都包含在结果中.因此,最终链接需要解析我实际上没有使用的库组件所做的引用.
我想要做的是从MyLibrary.bc中提取我的应用程序所需的位代码文件.我看到有一个llvm-ar程序,但在阅读它时,我不会觉得它会有所帮助.我猜我可以将库与llvm-ar结合使用而不是llvm-link,但我无法弄明白.我希望我所需要的只是一点推动:)
编辑:实际上是 ar 使它起作用。
虽然有点晚了,但仍然可能与某人相关,我们使用ar
和ld.gold
与 LLVM 插件来链接位码:
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
Run Code Online (Sandbox Code Playgroud)
当然,LLVMgold.so 的路径可能会有所不同。这样生成的 .bc 就只有需要的符号。
归档时间: |
|
查看次数: |
6388 次 |
最近记录: |