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