使用llvm库构建时如何链接?

时间:2015-11-27 00:04:31

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

我正在尝试解析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选项链接?我希望它作为独立的二进制文件工作,而不是整个编译过程中的传递。

1 个答案:

答案 0 :(得分:4)

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

但是既然你提到了#34;独立&#34;我猜你试图用llvm源项目构建你的项目。 llvm-config是你的朋友。

例如,您可以在tools/llvm-link Makefile内找到:

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用于其他有用选项。