将 LLVM 位码加载到模块中:无法将‘std::unique_ptr<llvm::Module>’转换为‘llvm::Module*’

Load LLVM bitcode into module: cannot convert ‘std::unique_ptr<llvm::Module>’ to ‘llvm::Module*’

我尝试从 here

编译最小示例
#include <llvm/IR/Module.h>
#include <llvm/IRReader/IRReader.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/Support/SourceMgr.h>

using namespace llvm;
int main()
{
  LLVMContext context;
  SMDiagnostic error;
  Module *m = parseIRFile("hello.bc", error, context);

  if(m)
  {
    m->dump();
  } 

  return 0;
}

使用

g++ myFile.cpp `llvm-config --cxxflags --ldflags --libs all --system-libs` -std=c++11 -ldl -lpthread

并得到

错误:无法在初始化中将‘std::unique_ptr’转换为‘llvm::Module*’

所有示例和 llvm 源代码本身都使用 llvm::Module *;那么为什么我会收到此错误?

注意我使用:LLVMVersion=3.6.0svn LLVM_CONFIGTIME= Thu Dec 18 10:51:37 CET 2014 是不是3.6的trunk有问题?我应该选择 3.5 分支吗?

谢谢 亚历克斯

问题是 parseIRFile 返回 unique_ptr<Module> 并且没有从 unique_ptr<Module>Module* 的隐式转换(这很好!!)。要修复,只需使用正确的类型:

std::unique_ptr<Module> m = parseIRFile(..);
auto m = parseIRFile(..); // avoid all future type issues

使用 unique_ptr 进行内存管理比使用原始指针要聪明得多 - 并且此接口清楚地表明您对 m 的所有权负责。这样,您就不必记得删除它。

如果你真的真的想要使用原始指针,只需对返回的对象调用release,这样它就不再拥有它了:

Module* m = parseIRFile(..).release();

我只是为了完整起见才展示它 - 真的更喜欢让你的对象成为 unique_ptr