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

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

14

Решение

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

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

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

5

Другие решения

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

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

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

3

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

-1

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

brew install llvm

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

-2
По вопросам рекламы [email protected]