Я хочу использовать 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.
Clang поставляется с некоторыми пользовательскими включениями. Так что обычно у вас есть лязг
/ USR / бен / лязг ++
и включает в себя
/usr/lib/clang/3.6.1/include
но лязг ищет их как относительный путь:
../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
Ваша проблема должна быть решена.