Как использовать стандартную библиотеку с Clang и LibTooling

Я хочу использовать Clang и LibTooling для создания некоторых инструментов анализа и преобразования источников c++. Я построил Clang и LibTooling после этой учебник, и я смог запустить и создать некоторые инструменты анализа и скомпилировать программы на C++, используя двоичный файл Clang, который я построил. Однако, если я включаю заголовки из стандартной библиотеки (в исходные файлы или мои инструменты), я сталкиваюсь с проблемами при компиляции или запуске исходных файлов/инструментов. Например, если я запускаю clang-проверьте следующий исходный файл C++:

#include <iostream>

int main() {
  std::cout << "Hello";
  return 0;
}

Я получаю "фатальная ошибка: файл "iostream" не найден". (Примечание: Я могу компилировать программы на C++, например, с пользовательскими классами, а не программы на C++, используя стандартную библиотеку.) В попытке решить проблему я построил libc++ (после этой руководство, создание его в каталоге llvm/project, где я построил LLVM и Clang), но у меня все еще возникают проблемы с получением Clang и инструментов для использования libc++. Теперь, если я попытаюсь скомпилировать тестовый файл использование:

export CPLUS_INCLUDE_PATH="~/clang-llvm/llvm/projects/libcxx/include"
export LD_LIBRARY_PATH="~/clang-llvm/llvm/projects/libcxx/lib"
~/clang-llvm/llvm/build/bin/clang++ ~/Documents/main.cpp

затем я получаю "фатальная ошибка:" unistd.H-файл не найден". Поэтому мой вопрос таков: Как правильно указать Clang и мои инструменты для использования libc++?

Я запускаю OS X Yosemite 10.10 и использую Clang 3.6.0.

4 ответов


Clang поставляется с некоторыми обычай включает в себя. Так что, как правило, вы звоните в / usr/bin / clang++ и включает в / usr/lib/clang/3.6.1 / include

но clang ищет их как относительный путь: ../ lib/clang/3.6.1 / include

поэтому убедитесь, что этот относительный путь доступен либо из двоичного файла clang++, либо из вашего приложения libtooling.


включите свой инструмент в это:

#include "clang/Tooling/CommonOptionsParser.h"      // For reading compiler switches from the command line
#include "clang/Tooling/Tooling.h"

static cl::OptionCategory MyToolCategory("SearchGlobalSymbols");
static cl::extrahelp MoreHelp("\nMore help text...");       // Text that will be appended to the help text. You can leave out this line.
/* Your code (definition of your custom RecursiveASTVisitor and ASTConsumer) */
/* Define class MyASTFrontendAction here, derived from ASTFrontendAction */

int main(int argc, const char **argv)
{
    /* Your code */
    CommonOptionsParser op(argc, argv, MyToolCategory);                     // Parse the command-line arguments
    ClangTool Tool(op.getCompilations(), op.getSourcePathList());           // Create a new Clang Tool instance (a LibTooling environment)
    return Tool.run(newFrontendActionFactory<MyASTFrontendAction>().get()); // Run custom Frontendaction
}

CommonOptionsParser позволяет читать команды из командной строки, которые передаются компилятору. Например, теперь вы можете вызвать свой инструмент следующим образом:

your-tool yoursourcefile.c -- -nostdinc -I"path/to/your/standardlibrary"

все после двойной тире будет передано компилятору. Возможные флаги описаны здесь: http://clang.llvm.org/docs/CommandGuide/clang.html

- nostdinc говорит препроцессору не искать стандарт включить пути. Вы можете указать свои собственные пути вместо - I.

надеюсь, что это помогло кому-то :) спросите меня, если я не был достаточно конкретным.


вы переместили/переименовали какой-либо из родительских каталогов после создания / установки? Компилятор должен был быть настроен так, чтобы знать, где искать его стандартные библиотеки, без необходимости указывать пути переменных среды.


использовать доморощенного и установите llvm с помощью команды

brew install llvm

ваша проблема должна быть решена.