Подтвердить что ты не робот

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

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

#include <iostream>

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

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

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 и мои инструменты на использование libС++?

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

4b9b3361

Ответ 1

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

но clang ищет их как относительный путь: ../Library/лязг/3.6.1/включить

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

Ответ 2

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

#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 сообщает Препроцессору не искать стандартные пути include. Вы можете указать свои собственные пути вместо -I.

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

Ответ 3

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

Ответ 4

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

brew install llvm

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