использование файлов .pch с API libclang

Я пытаюсь использовать .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. Теперь я просто хочу, чтобы синтаксический анализ происходил с одним рассматриваемым файлом. Возможно ли это сделать?


person abhanshu    schedule 05.05.2011    source источник
comment
Вы когда-нибудь решали эту проблему? Я вижу то же самое.   -  person Cory Kilger    schedule 11.06.2011


Ответы (3)


Я столкнулся с похожей проблемой, возможно, решение тоже похоже:

Я использую 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");
//...
person 4ian    schedule 12.06.2011

Используйте это так:

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

Это решит вашу проблему. Однако есть большая проблема, когда вы хотите использовать несколько pch... Это не работает, даже с компилятором clang++.

person majkl    schedule 09.11.2011

В документации clang вы можете найти пример исходного кода:

// 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.

person 4ntoine    schedule 10.11.2014