llvm 5.0链接错误与llvm :: Module :: dump()

时间:2017-09-22 15:10:09

标签: c++ llvm llvm-clang llvm-c++-api

过去两天我试图将LLVM与My C ++项目联系起来,并且它最终正在运行,但问题是当我使用dump()方法时它会给出一个链接器错误,我认为问题出在我链接的库,所以我将我的可执行文件链接到所有LLVM库(模块)但没有成功。所以这是LLVM5.0代码库中的一个错误,或者我做错了什么,以及我特别谈到LLVM5.0的原因,因为我已经读过其他地方(LLVM-5.0 Makefile undefined reference fail)评论部分没有问题使用LLVM4.0编译相同的代码,当然我已经搜索了其他解决方案,但没有什么

llvm_test.cpp:

#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"

llvm::LLVMContext context;

int main(){
    llvm::Module*module = new llvm::Module("llvm-module",context);
    module->dump();
}

命令:

clang++ -O3  -Wall -std=c++11 `llvm-config --cppflags --ldflags` `llvm-config --libs core --system-libs` toy.cpp 

以及关于所有模块的链接:

clang++ -O3 -Wall -std=c++11 `llvm-config --cxxflags --ldflags` `llvm-config --libs all --system-libs` toy.cpp 

编译器: Apple Clang 8.0.0 x86_64

操作系统: mac OS 10.12.5

感谢您提前提供任何帮助

2 个答案:

答案 0 :(得分:10)

好的,我查看了llvm的代码,你可以更容易地做到这一点。您所要做的就是停止使用转储,而不是:

module->print(llvm::errs(), nullptr);

这正是dump在内部的作用。

答案 1 :(得分:1)

所以在解决问题之后,它最终导致我对问题的简单攻击部分解决方案回到了上面链接中回答问题的人,但我会给出问题的完整解决方案,但在我回答之前我需要提醒你注意这个解决方案适用于LLVM5.0,所以我不知道它是否适用于其他版本。

-first:我已经从文件 AsmWriter.cpp 文件中复制了llvm::LLVMContext::dump的定义,您可以找到各种{{1}的定义我在这个文件的整个末尾复制了所有以备将来使用的方法我将编写我用过的 LLVMDump.cpp 的内容

<强> LLVMDump.cpp

llvm::Dump

请注意,我已将旧的包含目录#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringExtras.h" #include "llvm/IR/AssemblyAnnotationWriter.h" #include "llvm/IR/CFG.h" #include "llvm/IR/CallingConv.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DebugInfo.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/IRPrintingPasses.h" #include "llvm/IR/InlineAsm.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/IR/ModuleSlotTracker.h" #include "llvm/IR/Operator.h" #include "llvm/IR/Statepoint.h" #include "llvm/IR/TypeFinder.h" #include "llvm/IR/UseListOrder.h" #include "llvm/IR/ValueSymbolTable.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/Format.h" #include "llvm/Support/FormattedStream.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" #include "llvm/BinaryFormat/Dwarf.h" #include <algorithm> #include <cctype> using namespace llvm; LLVM_DUMP_METHOD void Value::dump() const { print(dbgs(), /*IsForDebug=*/true); dbgs() << '\n'; } // Type::dump - allow easy printing of Types from the debugger. LLVM_DUMP_METHOD void Type::dump() const { print(dbgs(), /*IsForDebug=*/true); dbgs() << '\n'; } // Module::dump() - Allow printing of Modules from the debugger. LLVM_DUMP_METHOD void Module::dump() const { print(dbgs(), nullptr, /*ShouldPreserveUseListOrder=*/false, /*IsForDebug=*/true); } // \brief Allow printing of Comdats from the debugger. LLVM_DUMP_METHOD void Comdat::dump() const { print(dbgs(), /*IsForDebug=*/true); } // NamedMDNode::dump() - Allow printing of NamedMDNodes from the debugger. LLVM_DUMP_METHOD void NamedMDNode::dump() const { print(dbgs(), /*IsForDebug=*/true); } LLVM_DUMP_METHOD void Metadata::dump() const { dump(nullptr); } LLVM_DUMP_METHOD void Metadata::dump(const Module *M) const { print(dbgs(), M, /*IsForDebug=*/true); dbgs() << '\n'; } 更改为#include "llvm/Support/Dwarf.h"

-second:我已将 LLVMDUmp.cpp 编译为静态库,以便在以后需要时链接到它。

如果你不知道如何在mac上创建静态链接库,因为-static标志不适用于mac上的clang或gcc

#include "llvm/BinaryFormat/Dwarf.h"

然后创建静态链接库

clang++ -std=c++1z -O3 -c LLVMDump.cpp -o LLVMDump.o 

现在只需将 libLLVMDump.a 移动到您计算机上的lib目录,以便在需要时使用它(如果您不知道应该从llvm安装中设置lib目录的位置)使用llvm-config

ar -rv libLLVMDump.a LLVMDump.o 

它将显示你应该将你的llvm / lib目录放在何处安装。

<强>试验:  如果你想要

,你可以使用问题中的代码
llvm-config --lib-dir

注意我们刚刚创建的LLVMDump。

我希望帮助任何人和快乐编码。