使用 llvm 库构建时如何 link?
How do I link when building with llvm libraries?
我正在尝试解析 LLVM-IR 文件 (.ll) 并进行静态分析..
我在下面找到了这个示例代码,我尝试构建它,但我不知道要构建哪个库 link。
#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;
}
我给出了以下构建命令,它给了我一些未定义的引用错误,我认为这是一个 linking 错误。
g++ -I~/llvm/build/include -I~/llvm/llvm/include -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -std=c++11 test.cpp
为了构建此示例代码,我应该 link 使用 -L 选项选择哪个库文件?我希望它作为一个独立的二进制文件工作,而不是作为整个编译过程中的一个通道。
如果您将项目设置为 llvm 的子项目,您可以阅读 this tutorial and examples。
但是既然你提到了 "standalone" 我猜你试图从 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
看看如何link这些库。
$ llvm-config --libs linker bitreader bitwriter asmparser irreader
或
$ llvm-config --libs BitWriter Core IRReader Linker Support
他们将输出 link 选项,如:
-lLLVMLinker -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMTarget -lLLVMMC -lLLVMIRReader -lLLVMBitReader -lLLVMAsmParser -lLLVMBitWriter -lLLVMCore -lLLVMSupport
llvm-config --components
可以查看所有官方组件;如果您厌倦了指定组件,只需使用 llvm-config --libs
它将发出 all linkable libraries.
当然你首先要确保库目录在你的link路径下,也就是结果llvm-config --libdir
.
您可以使用 llvm-config --help
其他有用的选项。
我正在尝试解析 LLVM-IR 文件 (.ll) 并进行静态分析..
我在下面找到了这个示例代码,我尝试构建它,但我不知道要构建哪个库 link。
#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;
}
我给出了以下构建命令,它给了我一些未定义的引用错误,我认为这是一个 linking 错误。
g++ -I~/llvm/build/include -I~/llvm/llvm/include -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -std=c++11 test.cpp
为了构建此示例代码,我应该 link 使用 -L 选项选择哪个库文件?我希望它作为一个独立的二进制文件工作,而不是作为整个编译过程中的一个通道。
如果您将项目设置为 llvm 的子项目,您可以阅读 this tutorial and examples。
但是既然你提到了 "standalone" 我猜你试图从 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
看看如何link这些库。
$ llvm-config --libs linker bitreader bitwriter asmparser irreader
或
$ llvm-config --libs BitWriter Core IRReader Linker Support
他们将输出 link 选项,如:
-lLLVMLinker -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMTarget -lLLVMMC -lLLVMIRReader -lLLVMBitReader -lLLVMAsmParser -lLLVMBitWriter -lLLVMCore -lLLVMSupport
llvm-config --components
可以查看所有官方组件;如果您厌倦了指定组件,只需使用 llvm-config --libs
它将发出 all linkable libraries.
当然你首先要确保库目录在你的link路径下,也就是结果llvm-config --libdir
.
您可以使用 llvm-config --help
其他有用的选项。