首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何结合Clang和LibTooling使用标准库

如何结合Clang和LibTooling使用标准库
EN

Stack Overflow用户
提问于 2014-11-23 18:23:49
回答 4查看 4.7K关注 0票数 14

我想使用Clang和LibTooling创建一些C++源代码分析和转换工具。我按照LibTooling教程构建了Clang和this,并且能够使用我构建的Clang二进制文件运行和创建一些分析工具并编译C++程序。但是,如果我包括标准库中的头(无论是源文件还是工具),在编译或运行源文件/工具时都会遇到问题。例如,如果我运行clang--检查以下C++源文件:

代码语言:javascript
复制
#include <iostream>

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

我得到“致命错误:'iostream‘文件找不到”。(注意:我可以编译C++程序,例如那些带有用户定义类的程序,而不是使用标准库的C++程序。)为了解决这个问题,我构建了libc++ (遵循this指南,在我构建LLVM和Clang的llvm/project目录中构建它),但是我仍然很难获得Clang和使用libc++的工具。现在,如果我试图使用以下方法编译一个测试文件:

代码语言:javascript
复制
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++?

我正在运行10.10并使用Clang3.6.0。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-09 19:20:19

Clang附带了一些定制的内容。所以通常在/usr/bin/ clang ++中有clang,包含in /usr/lib/clang/3.6.1/include。

但是clang将它们视为相对路径:./lib/clang/3.6.1/include

因此,请确保这个相对路径可以从clang++二进制文件或libtooling访问。

票数 6
EN

Stack Overflow用户

发布于 2015-11-13 11:24:33

将您的工具包括在内:

代码语言:javascript
复制
#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允许您从传递给编译器的命令行中读取命令。例如,您现在可以这样调用您的工具:

代码语言:javascript
复制
your-tool yoursourcefile.c -- -nostdinc -I"path/to/your/standardlibrary"

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

-nostdinc告诉预处理器不要寻找标准的包含路径。您可以在-I之后指定自己的路径。

希望它能帮上忙:)问我是否不够具体。

票数 3
EN

Stack Overflow用户

发布于 2015-07-06 18:59:00

在生成/安装之后,是否移动/重命名了任何父目录?编译器应该配置为知道在哪里查找其标准库,而不必指定环境变量路径。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27092593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档