我正在使用clang库构建一个应用程序,我正在运行一个 问题,如果有人可以给出一些指示,将会非常有帮助。
#./a.out /home/nmathew/Desktop/algorithms/array.cpp
给出了
In file included from /home/nmathew/Desktop/algorithms/array.cpp:1:
In file included from /usr/include/c++/4.4.3/iostream:39:
In file included from /usr/include/c++/4.4.3/ostream:39:
In file included from /usr/include/c++/4.4.3/ios:38:
In file included from /usr/include/c++/4.4.3/iosfwd:40:
/usr/include/c++/4.4.3/bits/stringfwd.h:49:48: error: unknown type
name 'char_traits'
a.out: TextDiagnosticPrinter.cpp:293: void clang::TextDiagnosticPrinter::EmitCaretDiagnostic(clang::SourceLocation,clang::SourceRange*, unsigned int, const clang::SourceManager&, const
clang::FixItHint*, unsigned int, unsigned int, unsigned int, unsigned
int, unsigned int): Assertion `LangOpts && "Unexpected diagnostic
outside source file processing"' failed.
Stack dump:
0. /usr/include/c++/4.4.3/bits/stringfwd.h:49:48: current parser token
'char_traits'
Aborted (core dumped)
我的包含搜索目录如下。
#include "..."
搜索从这里开始:
#include <...>
搜索从这里开始:
在/ usr /包括/ Linux的
/usr/lib/gcc/i686-redhat-linux/4.4.3/include
/usr/include/c++/4.4.3
/usr/include/c++/4.4.3/backward
/usr/include/c++/4.4.3/i686-redhat-linux
在/ usr /本地/包括
在/ usr /包括
搜索结束列表。
和char_traits.h在/usr/include/c++/4.4.3/bits/,我正在使用
Fedora 12 32bit系统。
我的代码列在下面
tut01_pp.cpp
#include "PPContext.h"
int main(int argc, char *argv[])
{
if (argc != 2)
{
return 0;
}
PPContext scope;
scope.headers.PrintStats();
const FileEntry *File = scope.fm.getFile(argv[1]);
if(!File)
{
return 0;
}
scope.sm.createMainFileID(File, SourceLocation());
scope.pp->EnterMainSourceFile();
IdentifierTable identitab(scope.lang);
MinimalAction action(*(scope.pp));
Parser parse(*(scope.pp), action);
parse.ParseTranslationUnit();
identitab.PrintStats();
return 0;
}
PPContext.h
#ifndef PP_CONTEXT
#define PP_CONTEXT
#include <iostream>
#include <string>
using namespace std;
#include <llvm/Support/raw_ostream.h>
#include <clang/Basic/Diagnostic.h>
#include <clang/Basic/TargetInfo.h>
#include <clang/Basic/TargetOptions.h>
#include <clang/Basic/FileManager.h>
#include <clang/Basic/SourceManager.h>
#include <clang/Lex/Preprocessor.h>
#include <clang/Lex/HeaderSearch.h>
#include <clang/Frontend/Utils.h>
#include <clang/Frontend/TextDiagnosticPrinter.h>
#include <clang/Frontend/DiagnosticOptions.h>
#include <clang/Frontend/HeaderSearchOptions.h>
#include <clang/Parse/Action.h>
#include <clang/Parse/Parser.h>
#include "llvm/System/Host.h"
using namespace clang;
using namespace llvm;
struct PPContext {
PPContext():tdp(ost, options), diag(&tdp), sm(diag), headers(fm)
{
TargetOptions target_options;
target_options.Triple = sys::getHostTriple();
target_options.CXXABI = "itanium";
target = TargetInfo::CreateTargetInfo(diag, target_options);
lang.CPlusPlus = 1;
pp = new Preprocessor(diag, lang, *target, sm, headers);
headeropts.EnvIncPath = "/usr/include/linux";
headeropts.CXXEnvIncPath =
"/usr/lib/gcc/i686-redhat-linux/4.4.3/include/";
headeropts.Verbose = 1;
ApplyHeaderSearchOptions(headers, headeropts, lang,
llvm::Triple(target_options.Triple));
};
~PPContext()
{
delete pp;
delete target;
};
llvm::raw_stdout_ostream ost;
const DiagnosticOptions options;
TextDiagnosticPrinter tdp;
Diagnostic diag;
LangOptions lang;
SourceManager sm;
FileManager fm;
HeaderSearch headers;
TargetInfo *target;
Preprocessor *pp;
HeaderSearchOptions headeropts;
};
#endif //#ifndef PP_CONTEXT
array.cpp
#include <iostream>
#include "array.hpp"
using namespace std;
template <class gen>
ARRAY<gen>::ARRAY()
{
size = MAX;
ptr = (gen (*)[MAX])new gen[size];
}
template <class gen>
ARRAY<gen>::ARRAY(int array_size)
{
size = array_size;
ptr = (gen (*)[])new gen[size];
}
template <class gen>
ARRAY<gen>::~ARRAY()
{
delete (gen (*)[MAX])ptr;
}
template <class gen>
int ARRAY<gen>::getsize()
{
return size;
}
template <class gen>
ARRAY<gen>::ARRAY(const ARRAY &orig)
{
ptr = (gen (*)[MAX])new gen[orig.size];
memcpy(ptr, orig.ptr, sizeof(gen)*orig.size);
size = orig.size;
}
template <class gen>
gen& ARRAY<gen>::operator [](unsigned int index)
{
return *ptr[index];
}
int main(void)
{
ARRAY <int> intarray;
intarray[8] = 16;
return 0;
}
答案 0 :(得分:0)
错误显示模板类“char_traits”不存在。这个实际上是在“char_traits.h”中定义的,不包含在“array.cpp”中。
虽然在此文件中,但它显示为:
/** @file char_traits.h
* This is an internal header file, included by other library headers.
* You should not attempt to use it directly.
*/
但是你仍然可以尝试将其包括在内并使clang高兴。