Clang 如何使用llvm ar生成的归档文件?

Clang 如何使用llvm ar生成的归档文件?,clang,llvm,Clang,Llvm,llvm ar将多个llvm位代码文件归档到一个可链接到程序的归档库中。存档操作按预期工作。同样,可以使用llvm nm来显示生成的存档中的所有符号 但是,我注意到生成的归档文件不能被其他标准llvm工具使用,例如,llc、lli和llvm链接 为了使用生成的存档文件,我必须从存档文件中提取所有位代码文件,然后由llc直接使用它们 问题: 通过llvm ar,是否有更优雅或高效的方法来使用生成的存档文件 可以直接使用位码存档文件,如下所示: 像llc、lli、opt等LLVM工具不能直接对位码存

llvm ar
将多个llvm位代码文件归档到一个可链接到程序的归档库中。存档操作按预期工作。同样,可以使用
llvm nm
来显示生成的存档中的所有符号

但是,我注意到生成的归档文件不能被其他标准llvm工具使用,例如,
llc
lli
llvm链接

为了使用生成的存档文件,我必须从存档文件中提取所有位代码文件,然后由
llc
直接使用它们

问题:

  • 通过
    llvm ar
    ,是否有更优雅或高效的方法来使用生成的存档文件

  • 可以直接使用位码存档文件,如下所示:


  • llc
    lli
    opt
    等LLVM工具不能直接对位码存档进行操作。您必须在运行它们之前将其解压缩。或者,您可以将归档项链接到单个位代码文件中,但这与归档不同,因此这取决于是否适合您


    至于
    clang
    ,您可以将位码存档与源文件和库一起传递,它会做正确的事情-解包,运行passs,编译到目标文件并链接到最终二进制文件。

    因此,您的问题仅针对存档BC文件,还是它是OBJ和BC的组合?我的问题针对存档BC文件,我也更新了问题。谢谢你指出了歧义。你所说的
    使用方法是什么意思
    clang
    可以立即处理位码存档。@arrowd,我的意思是如果位码存档可以直接由clang/llc/lli/llvm链接使用,而无需取消存档。你能举一个例子说明一下clang是如何使用位码档案的吗?请您也指定一下clang的版本好吗。我担心我的叮当版本是3.8,它可能太低了。谢谢。谢谢你的回复。我花了一个小时研究如何使用clang构建位码存档文件,但还是失败了。。。我在问题中添加了代码,您能指出如何修复它吗?
    libhello
    文件应该有
    .bca
    扩展名
    .ll
    用于文本IR文件,因此clang尝试将其解析为文本。感谢您的提示,我将.ll扩展名更改为.bca,但它仍然不适用于我。我在问题中添加了新的错误消息。PS:我也试过使用clang-5.0,它也可以。再次感谢。叮当5可能还是太老了。我用Clang9可以使用它。我试过Clang9.0.0,但仍然不起作用。我可以知道你的确切版本是什么吗?谢谢
    // assumes hello.bc is valid bitcode file and it is built successfully
    clang-3.8  -o main main.c hello.bc
    
    // ar hello.bc into lib libhello.bca
    llvm-ar-3.8 rcs libhello.bca hello.bc
    
    llvm-nm libhello.bca // has below output
    
       hello.bc:
       ---------------- T outupt
                        U puts
    
    clang-3.8 -o main main.c libhello.bca // has below error
    
      libhello.bca: error adding symbols: File format not recognized
      clang: error: linker command failed with exit code 1 (use -v to see invocation)