使用带有libclang api的.pch文件

时间:2011-05-05 06:26:17

标签: c++ llvm clang pch

我正在尝试使用.pch,如以下示例所示http://clang.llvm.org/doxygen/group__CINDEX.html,但它似乎不起作用。

char * args [] = {“ - Xclang”,“ - include-pch = IndexTest.pch”};

TU = clang_createTranslationUnitFromSourceFile(Idx,“IndexTest.c”,2,args,0,0);

libclang无法读取-include-pch标志,它将其读作-include标志。

我想要的是以下内容: 我的代码取决于很多标题。我想解析并创建一次翻译单元并将其另存为pch文件。 现在我只想解析一个有问题的文件。有可能吗?

3 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,也许解决方案也类似:

我正在使用clang在内部编译一些代码,以及一个包含要发送给编译器的参数的向量:

llvm::SmallVector<const char *, 128> Args;
Args.push_back("some");
Args.push_back("flags");
Args.push_back("and");
Args.push_back("options");
//...

添加像“Args.push_back(” - include-pch myfile.h.pch“)这样的行;”由于-include-pch标志被读为-include标志这一事实,将导致错误。

在这种情况下,如果要使用pch文件,则必须使用“两个”参数:

llvm::SmallVector<const char *, 128> Args;
//...
Args.push_back("-include-pch");
Args.push_back("myfile.h.pch");
//...

答案 1 :(得分:0)

像这样使用:

char *args[] = { "-Xclang", "-include-pch", "IndexTest.pch" };

这将解决您的问题。但是,当你想使用多个pch时,会出现一个更大的问题...即使使用clang ++编译器也无法正常工作。

答案 2 :(得分:0)

clang's documentation中,您可以找到源代码示例:

// excludeDeclsFromPCH = 1, displayDiagnostics=1
Idx = clang_createIndex(1, 1);

// IndexTest.pch was produced with the following command:
// "clang -x c IndexTest.h -emit-ast -o IndexTest.pch"
TU = clang_createTranslationUnit(Idx, "IndexTest.pch");

// This will load all the symbols from 'IndexTest.pch'
clang_visitChildren(clang_getTranslationUnitCursor(TU), TranslationUnitVisitor, 0);
clang_disposeTranslationUnit(TU);

// This will load all the symbols from 'IndexTest.c', excluding symbols
// from 'IndexTest.pch'.
char *args[] = { "-Xclang", "-include-pch=IndexTest.pch" };
TU = clang_createTranslationUnitFromSourceFile(Idx, "IndexTest.c", 2, args, 0, 0);
clang_visitChildren(clang_getTranslationUnitCursor(TU), TranslationUnitVisitor, 0);
clang_disposeTranslationUnit(TU);

虽然我没有检查。你找到工作解决方案吗?查看有关PCH的my question