【问题标题】:How do I link when building with llvm libraries?使用 llvm 库构建时如何链接?
【发布时间】:2015-11-27 00:04:31
【问题描述】:

我正在尝试解析 LLVM-IR 文件 (.ll) 并进行静态分析..

我在下面找到了这个示例代码,并尝试构建它,但我不知道要链接哪个库。

#include <iostream>
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IRReader/IRReader.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h"

using namespace llvm;

int main(int argc, char** argv)
{
    if (argc < 2) {
        errs() << "Expected an argument - IR file name\n";
        exit(1);
    }

    LLVMContext &Context = getGlobalContext();
    SMDiagnostic Err;
    std::unique_ptr<Module> Mod = parseIRFile(argv[1], Err, Context);

    if (Mod) {
        std::cout << "Mod is not null" << std::endl;
    }
    else {
       std::cout << "Mod is null" << std::endl;
    }
    return 0;
}

我给出了以下命令来构建,它给了我一些未定义的引用错误,我认为这是一个链接错误。

g++ -I~/llvm/build/include -I~/llvm/llvm/include  -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -std=c++11 test.cpp

为了构建此示例代码,我应该使用 -L 选项链接哪个库文件?我希望它作为一个独立的二进制文件工作,而不是作为整个编译过程中的一个传递。

【问题讨论】:

    标签: compiler-construction llvm static-analysis llvm-clang llvm-ir


    【解决方案1】:

    如果您将项目设置为 llvm 的子项目,您可以阅读 this tutorialexamples

    但既然你提到了“独立”,我猜你试图用 llvm 源项目构建你的项目。 llvm-config 是你的朋友。

    例如,你可以发现在tools/llvm-linkMakefile里面写着:

    LINK_COMPONENTS := linker bitreader bitwriter asmparser irreader
    

    CMakeLists.txt:

    set(LLVM_LINK_COMPONENTS
      BitWriter
      Core
      IRReader
      Linker
      Support
      )
    

    然后你可以使用llvm-config 看看如何链接这些库。

    $ llvm-config --libs linker bitreader bitwriter asmparser irreader
    

    $ llvm-config --libs BitWriter Core IRReader Linker Support
    

    他们会输出如下链接选项:

    -lLLVMLinker -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMTarget -lLLVMMC -lLLVMIRReader -lLLVMBitReader -lLLVMAsmParser -lLLVMBitWriter -lLLVMCore -lLLVMSupport
    

    llvm-config --components可以查看所有官方组件;如果您厌倦了指定组件,只需使用llvm-config --libs,它就会发出所有可链接库。

    当然你首先要确保库目录在你的链接路径中,结果是llvm-config --libdir

    您可以将llvm-config --help 用于其他有用的选项。

    【讨论】:

    • 我试过这个,但它仍然给了我未定义的参考,所以我搜索了一点,找到了这个页面(stackoverflow.com/questions/12993460/…)并解决了这个问题。无论如何,谢谢。
    猜你喜欢
    • 2021-11-14
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多