我尝试从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主干的问题吗?我应该选择3.5分支吗?
THX 亚历
答案 0 :(得分:3)
问题在于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
。