如果我在一个大项目中有多个文件,所有这些文件共享大量包含的头文件,有没有办法分享解析头文件的工作?我曾希望创建一个索引,然后向其添加多个translationUnit可能会导致一些工作被共享 - 但即使代码也是如此(伪代码)
index = clang_createIndex();
clang_parseTranslationUnit(index, "myfile");
clang_parseTranslationUnit(index, "myfile");
似乎每次调用parseTranslationUnit需要花费足够的时间,表现不比
好index1 = clang_createIndex();
clang_parseTranslationUnit(index1, "myfile");
index2 = clang_createIndex();
clang_parseTranslationUnit(index2, "myfile");
我知道有用于重新分析完全相同文件的专门函数;但是我真正想要的是解析“myfile1”和“myfile2”可以共享解析“myheader.h”的工作,而解析特定的函数也无济于事。
作为一个子问题,重用索引和为每个翻译单元创建新索引之间是否有任何有意义的区别?
答案 0 :(得分:2)
执行此操作的一种方法是从项目的共享标头创建预编译标头(PCH文件)。
这些方面似乎有用(你可以看到整个例子here):
auto Idx = clang_createIndex (0, 0);
CXTranslationUnit TU;
Timer t;
{
char const *args[] = { "-xc++", "foo.hxx" };
int nargs = 2;
t.reset();
TU = clang_parseTranslationUnit(Idx, 0, args, nargs, 0, 0, CXTranslationUnit_ForSerialization);
std::cerr << "PCH parse time: " << t.get() << std::endl;
displayDiagnostics (TU);
clang_saveTranslationUnit (TU, "foo.pch", clang_defaultSaveOptions(TU));
clang_disposeTranslationUnit (TU);
}
{
char const *args[] = { "-include-pch", "foo.pch", "foo.cxx" };
int nargs = 3;
t.reset();
TU = clang_createTranslationUnitFromSourceFile(Idx, 0, nargs, args, 0, 0);
std::cerr << "foo.cxx parse time: " << t.get() << std::endl;
displayDiagnostics (TU);
clang_disposeTranslationUnit (TU);
}
{
char const *args[] = { "-include-pch", "foo.pch", "foo2.cxx" };
int nargs = 3;
t.reset();
TU = clang_createTranslationUnitFromSourceFile(Idx, 0, nargs, args, 0, 0);
std::cerr << "foo2.cxx parse time: " << t.get() << std::endl;
displayDiagnostics (TU);
clang_disposeTranslationUnit (TU);
}
产生以下输出:
PCH parse time: 5.35074
0 diagnostics
foo1.cxx parse time: 0.158232
0 diagnostics
foo2.cxx parse time: 0.143654
0 diagnostics
我在API文档中找不到有关libclang和预编译头文件的更多信息,但以下是关键字显示的几个页面:CINDEX和TRANSLATION_UNIT
请注意,此解决方案无论如何都不是最佳选择。我期待看到更好的答案。特别是:
libclang
- 具体;这与使用标准clang
命令行进行构建时优化的策略完全相同。