Использование libclang 6.0.1: stddef.h не найден - PullRequest
0 голосов
/ 20 сентября 2018

Чтобы начать работать с libclang, я создаю очень простую программу, которая пытается загрузить очень простой исходный файл.Сбой с файлом 'stddef.h' не найден.

Вот программа, использующая libclang:

#include <clang-c/Index.h>
int main() {
    CXIndex index = clang_createIndex(1,1);
    const char *source_path = "foo.cpp";
    clang_createTranslationUnitFromSourceFile(index,"foo.cpp",0,0,0,0);
}

(Для краткости я пропустил код, который не имеет отношения к воспроизведению проблемы).

И вот файлЯ пытаюсь загрузить, foo.cpp:

#include <stddef.h>
int main() {}

Я использую LLVM и Clang 6.0.1, скомпилированные из источника следующим образом:

cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/local -DCMAKE_PREFIX_PATH=$HOME/local -DCMAKE_BUILD_TYPE=Release
make
make install

Быстрый поиск дает это обещаниеpost: Ошибка Clang - файл stddef не найден? К сожалению, это около llvm 3.5, и я использую llvm 6.0.1.Кроме того, каталог $ HOME / local, в который я установил LLVM и Clang, не имеет каталога / usr / lib, поэтому предлагаемое здесь решение не работает.

Заголовок stddef.h присутствует в $HOME/lib/clang/6.0.1/include/stddef.h.Явное добавление этого пути в качестве опции -isystem к вызову clang_createTranslationUnitFromSourceFile решает проблему.

Более того, путь поиска включения, используемый clang_createTranslationUnitFromSourceFile, не совпадает с тем, который используется clang ++;clang++ foo.cpp работает без ошибок.

Существует ли какая-либо документация по пути поиска включений, используемому clang_createTranslationUnitFromSourceFile и аналогичными функциями в libclang, чтобы я мог определить, какие пути включения необходимо добавить?

Любые другие предложения о том, как вызвать clang_createTranslationUnitFromSourceFile с правильным путем поиска включения, эквивалентным пути, используемому clang ++? *

1 Ответ

0 голосов
/ 20 сентября 2018

libclang работает так, как будто вы пытались скомпилировать файл, т. Е. Для анализа файла ему необходимо знать, где искать заголовки и потенциально другую информацию, такую ​​как определения макросов, флаги компиляции и т. Д.

clang_createTranslationUnitFromSourceFile имеет два параметра: num_clang_command_line_args и clang_command_line_args.Там вам нужно передать фактический путь поиска заголовка, например:

const char *cli_args[] = { "-I", "~/local" };
clang_createTranslationUnitFromSourceFile(index, "foo.cpp", 2, cli_args, 0, 0);
...