编译包含LLVM API标头的C++文件时出错



你好

我已经使用apt install安装了llvmllvm-debuginfo,并正在尝试编译此文件:

llvm_test.cpp

#include <stdio.h>
#include "llvm/IR/LLVMContext.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/IR/Module.h"
int main( int argc, char* argv[] )
{
if( argc < 2 )
llvm::errs() << "Expected an argument - IR file namen";
llvm::LLVMContext &context = llvm::getGlobalContext();
llvm::SMDiagnostic err;
llvm::Module* module = llvm::ParseIRFile( argv[1], err, context );
if( !mod )
{
err.print( argv[0], errs() );
return 1;
}
return 0;
}

使用以下命令:

$ clang++ -std=c++11 llvm_test.cpp `llvm-config --system-libs --cppflags --ldflags --libs core` -o llvm_test

但它似乎找不到所需的API头。这是错误消息:

llvm_test.cpp:9:13: error: no member named 'errs' in namespace 'llvm'
llvm::errs() << "Expected an argument - IR file namen";
~~~~~~^
llvm_test.cpp:11:39: error: no member named 'getGlobalContext' in namespace
'llvm'
llvm::LLVMContext &context = llvm::getGlobalContext();
~~~~~~^
llvm_test.cpp:13:33: error: no member named 'ParseIRFile' in namespace 'llvm'
llvm::Module* module = llvm::ParseIRFile( argv[1], err, context );
~~~~~~^
llvm_test.cpp:15:9: error: use of undeclared identifier 'mod'
if( !mod )
^
llvm_test.cpp:17:27: error: use of undeclared identifier 'errs'
err.print( argv[0], errs() );
^
5 errors generated.

正如注释中所建议的,在llvm配置参数中添加"support"并不会改变任何事情:同样的错误。

这是怎么回事

注意:我在Windows上使用Cygwin,我指的是apt下的apt cyg(类似于Cygwin的apt工具(。

1(错误:命名空间'llvm'中没有名为'errs'的成员

您必须包括:#include "llvm/Support/raw_ostream.h"

2( 错误:命名空间中没有名为"getGlobalContext"的成员

这是由于getGlobalContext在llvm 3.6之后被删除。因此,请使用:LLVMContext context;,并在需要时提供它的参考。

3( 错误:命名空间"llvm"中没有名为"ParseIRFile"的成员

您必须包括:#include "llvm/IRReader/IRReader.h"

4( 错误:使用未声明的标识符"mod">

在中使用module而不是mod

如果您需要errs,您应该包括右标题:

#include "llvm/Support/raw_ostream.h"

ParseIRFile应在llvm/IRReader/IRReader.h

#include "llvm/IRReader/IRReader.h"

最新更新