Как использовать стандартную библиотеку с 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
ваша проблема должна быть решена.