将 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
。
我尝试从 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
。