如何使用Clang和LibTooling的标准库

时间:2014-11-23 18:23:49

标签: c++ macos clang libc++ libtooling

我想使用Clang和LibTooling来创建一些C ++源代码分析和转换工具。我在this教程之后构建了Clang和LibTooling,并且我已经能够使用我构建的Clang二进制文件运行并创建一些分析工具并编译C ++程序。但是,如果我包含标准库中的标头(在源文件或我的工具中),则在编译或运行源文件/工具时会遇到问题。例如,如果我对以下C ++源文件运行clang-check:

#include <iostream>

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

我得到&#34;致命错误:&#39; iostream&#39;文件未找到&#34;。 (注意:我可以编译C ++程序,例如使用用户定义类的程序,而不是使用标准库的C ++程序。)为了解决这个问题,我构建了libc ++(在this指南之后,构建它)我构建LLVM和Clang的llvm / project目录,但我仍然无法获得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

然后我得到了致命的错误:&#39; unistd.h&#39;文件未找到&#34;。所以我的问题是:我如何正确地指出Clang和我的工具使用libc ++?

我正在运行OS X Yosemite 10.10并使用Clang 3.6.0。

4 个答案:

答案 0 :(得分:5)

Clang附带一些自定义包含。所以通常你都会铿锵有力 的/ usr /斌/铛++ 和包括在 /usr/lib/clang/3.6.1/include

但clang将它们视为相对路径: ../ LIB /铛/ 3.6.1 /包括

因此请确保可以从clang ++二进制文件或libtooling应用程序访问此相对路径。

答案 1 :(得分:3)

将您的工具包含在此:

your-tool yoursourcefile.c -- -nostdinc -I"path/to/your/standardlibrary"

CommonOptionsParser允许您从命令行读取传递给编译器的命令。 例如,您现在可以像这样调用您的工具:

@page {
  @bottom-center {content: "Copyright AMCE Pty Ltd";}
}

双击之后的所有内容都将传递给编译器。这里描述了可能的标志: http://clang.llvm.org/docs/CommandGuide/clang.html

-nostdinc告诉预处理器不要查找标准包含路径。您可以在-I。

之后指定自己的路径

希望它有所帮助:)问我是否不够具体。

答案 2 :(得分:-1)

构建/安装后是否移动/重命名了任何父目录?编译器应该已配置为知道在何处查找其标准库,而无需指定环境变量路径。

答案 3 :(得分:-2)

使用自制并使用命令

安装llvm
brew install llvm

你的问题应该解决。