【问题标题】:Stmt::viewAST is only available in debug builds on systems with Graphviz or gvStmt::viewAST 仅在带有 Graphviz 或 gv 的系统上的调试版本中可用
【发布时间】:2012-06-13 08:08:37
【问题描述】:

我一直在尝试使用以下方法使 clang 2.9 输出带有 graphviz 的 AST:

./clang -cc1 -ast-view smd.c 

但是它在控制台上输出代码并抱怨:

Stmt::viewAST 仅在带有 Graphviz 或 gv 的系统上的调试版本中可用!

在 llvm documentation 中提到应该将 /Applications/Graphviz.app/Contents/MacOS/ 添加到路径中。我使用export PATH=$PATH:/Applications/Graphviz.app/Contents/MacOS/ 这样做了,但仍然无法正常工作。

在同一文档中还提到:

要让它工作需要少量的配置。在带有 X11 的 Unix 系统上,安装 graphviz 工具包,并确保 'dot' 和 'gv' 在你的路径中。如果您在 Mac OS/X 上运行,请下载并安装 Mac OS/X Graphviz 程序,并将 /Applications/Graphviz.app/Contents/MacOS/(或安装它的任何位置)添加到您的路径。设置好系统和路径后,重新运行 LLVM 配置脚本并重建 LLVM 以启用此功能。

我不知道这个配置在哪里并重建 LLVM(我所做的只是下载 llvm+clang 2.9 包并直接从文件夹中运行命令。

关于我的graphviz版本:

$ dot -v
dot - graphviz version 2.28.0 (20111028.1807)

但是gv 命令不可用,我似乎无法在谷歌上找到它应该位于或获取的位置。

这有什么线索吗?问题本身是如何将 clang 2.9 输出到 graphviz。我只是相信这与我的机器上找不到的这个 gv 有关,但我可能会被误导。

谢谢。

【问题讨论】:

  • 您似乎下载了 Clang 的二进制文件,这很可能是发布版本。您需要下载源代码并构建调试 clang。
  • 谢谢乔伊!我想这就是我从他们的邮件列表中收到的回复。你介意用更多的指针来回答它,这样我就可以接受这个作为关于如何在调试模式下编译它的答案吗?另外,这个功能只在调试模式下有效,有什么特别的原因吗?

标签: clang graphviz abstract-syntax-tree


【解决方案1】:

由于我必须通过一些奇怪的细节才能使其正常工作,而且我认为这不是 Mac OS Lion 用户的直接方法,所以我发现了以下内容,以防有人像我一样陷入困境似乎是一个简单的单行任务。

  1. 首先,在任何事情之前,您可能想检查您是否有 graphviz 和 gv,正如我在最初的问题中提到的,如果您遇到与我相同的情况,那么您会抱怨 graphviz或 gv。虽然 graphviz 使用 google 相对容易找到,但 gv 在我看来并不像,因为它在他们的官方网站上缺少它的名字,即 GNU gv

  2. 安装 graphviz 应该不会让人头疼,但 gv 可能不会。它抱怨称为Xaw3d 的依赖项。他们的website 包含一个不是那么最新的版本(2003),但这就是我们要做的。如果您像我一样不幸,您会发现下载已损坏。幸运的是,一位朋友向我指出了这个website from MIT 的人,他不得不处理这个问题,因此为我节省了很多时间。在我回答这个问题时,它是最近的(2012 年 5 月),所以它也应该对你有用。我在这里发布我实际使用的内容,以防该页面出现故障:

  3. 获取ziptar 版本的gv

  4. 通过运行避免pkg-config utility

$ ./configure X11_CFLAGS='-I/usr/X11/include/X11' X11_LIBS='-L/usr/X11/lib -lX11 -lXext -lXmu -lXt'

在控制台上的 ibXaw3d-1.6 目录中。

接着是:

制作

sudo 安装

清理

完成后返回并安装 gv,如果它不起作用,请更改他们的代码,这对我来说也是错误的(在一行上缺少一些参数,导致无法完成安装),正如 MIT 页面提到的那样:

更改Scrollbar.c

(*swclass->threeD_class.shadowdraw) (w, event, region, FALSE);

(*swclass->threeD_class.shadowdraw) (w, event, region, sbw->threeD.relief, FALSE);

在 MAC 上,如果未运行以下命令,它也会抱怨僵尸进程,以防万一,作者还建议以这种方式完成配置:

./configure --x-includes=/usr/X11/include/X11 --x-libraries=/usr/X11/lib --enable-SIGCHLD-fallback

如果你运行$gb whatever.ps,最后 gv 应该是可用的。如果您想知道,这是它的用途之一,如果不是全部,请打开 .ps(我没有费心去看它,因为它不是最初的目的)。


现在,如果你还是像我一样倒霉,运行同样的东西是行不通的。

感谢 Joey(下面评论中的人)和 LLVM mailing list 人,我发现我应该在调试模式下运行构建。

现在看来,如果您像我最初为 MAC OS 下载的二进制文件一样,出于优化原因,它会自动进入 调试模式(快 10 倍左右,我使用了其中一个控制台上的输出)。

如果您转到this page 并按照 1. 到 5. 您将按照该页面上的说明获得已处于调试模式的最新版本。

确保您打开 LLVM/Debug+Accerts/bin/clang 并从该 clang 执行。结果应该在 gv 上用树打开一个 GUI。


您可能会注意到,我必须继续使用最新版本。有一种方法可以根据llvm getting started 在 llvm 编译时在调试模式下进行编译。基本上这一段说明了一切:

使用 --enable-optimized 选项来配置这些构建,或者通过在 gmake 命令行上指定 ENABLE_OPTIMIZED=1 来启用这些构建。对于这些构建,构建系统将编译启用 GCC 优化的工具和库,并从它生成的库和可执行文件中去除调试信息。请注意,使用 LLVM 分发时,Release Builds 是默认的。

虽然我收到了一些似乎证实我在调试模式下成功编译 2.9 的消息,例如:

llvm[0]: * 已完成调试构建

llvm[0]: * 注意:调试构建可能比构建慢 10 倍

llvm[0]:* 优化构建。使用 make ENABLE_OPTIMIZED=1 来

llvm[0]: * 进行优化构建。或者你可以

llvm[0]: * 使用 --enable-optimized 进行配置。

做同样的事情(在这种情况下,文件夹只被称为Debug 而不是Debug+Asserts),但是对于 2.9 进行相同的过程却不起作用。 如果有人知道为什么,请告诉我,因为我仍然对 2.9 感兴趣,但总而言之,终于可以直观地看到它了。 我仍然不知道为什么它只在 gv 上输出而不在 graphviz 上输出

【讨论】:

    【解决方案2】:

    虽然这个答案是在 6 年后才出现的,但它可能会添加一种更简单的方法来解决相同的问题。我今天遇到同样的问题,我用自制软件解决了。

    1. berw cask install Graphviz
    2. brew cask install xquartz #gv 的依赖
    3. brew cask install gv

    此外,请确保您使用的 clang 是调试版本,正如 OP 所提到的。

    【讨论】:

      猜你喜欢
      • 2012-05-30
      • 1970-01-01
      • 2018-06-09
      • 2012-04-07
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      相关资源
      最近更新 更多