【问题标题】:Using Clang's scan-build with scons and C++11使用 Clang 的 scan-build 和 scons 和 C++11
【发布时间】:2012-12-06 19:32:04
【问题描述】:

根据这些答案 [1, 2, 3],我已将所有内容添加到我的 $PATH 并调整了我的 SConstruct 以设置适当的环境变量。现在当我跑步时

scan-build --use-c++=`which clang++` scons

构建开始,我可以看到scons 分叉的进程是

/path/to/c++-analyzer ... -std=c++11 ...

目标文件成功构建,但随后出现错误:

could not find clang line

当派生进程不包含字符串-cc1 时,c++-analyzer 会出现此错误。但是如果我检查ps aux,我清楚地看到了

/path/to/clang -cc1 ...

程序怎么会正确构建,但静态分析器会这样失败?


供参考,如果我手动运行

scan-build clang++ <parameters from scons>

然后构建成功并生成报告!

我也可以通过添加“作弊”

env["ENV"]["PATH"] = os.environ["PATH"]

然后运行

CXX="scan-build clang++" scons

我无法在 scons 本身上运行 scan-build 并使用未修改的 SConstruct

【问题讨论】:

  • 您的问题在第一个链接答案中得到了回答:“SCons 通常会在运行构建之前清理环境(这是一项功能)。”
  • @Industrial-antidepressant 我已经使用了 Greg 建议的环境变量。我可以通过 Clang 和 SCons build 就好了;我无法运行 静态分析器
  • 嗯,试试 scan-build --use-analyzer=/path/to/clang
  • @Industrial-antidepressant --use-analyzer 不是 scan-build 的公认选项。
  • 该选项已于 2012 年 8 月 24 日星期五 23:08:08 添加到 clang,提交消息“重做 scan-build 如何选择用于静态分析的 clang 版本”,并与 clang 3.2 一起发布

标签: c++ c++11 clang scons scan-build


【解决方案1】:

问题是clang不在execution environment (Wayback Machine)的搜索路径上。这解释了为什么添加行 env["ENV"]["PATH"] = os.environ["PATH"] 可以解决问题。

要在未经修改的SConstruct 上运行scan-build,您可以将clang 可执行文件(clang++ 和可能的clang)放在执行环境使用的搜索路径上,例如通过在 Linux 上创建从 /usr/bin/clang++/path/to/clang++ 的符号链接。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题:目标文件成功构建,但随后出现错误:

    could not find clang line
    

    问题是我使用的标志对gcc 有效,但对clang 无效。

    touch empty.c
    
    scan-build gcc -fdiagnostics-show-caret -c empty.c
    scan-build: Using '/usr/bin/clang-8.exe' for static analysis
    could not find clang line
    ...
    
    scan-build --use-cc=clang gcc -fdiagnostics-show-caret -c empty.c
    scan-build: Using '/usr/bin/clang-8.exe' for static analysis
    clang-8: error: unknown argument: '-fdiagnostics-show-caret'
    ...
    

    删除-fdiagnostics-show-caret 使问题消失:

    scan-build gcc -c empty.c
    scan-build: Using '/usr/bin/clang-8.exe' for static analysis
    ...
    

    另外,为了搅局,clang 这个开关的名字是-fcaret-diagnosticsgcc 不会接受。

    【讨论】:

    • 编辑:我应该注意到scan-build -v -v -v这里只显示了最少量的信息,而且没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2013-07-26
    • 2017-03-20
    • 2012-08-31
    • 2014-04-02
    • 1970-01-01
    • 2012-05-23
    相关资源
    最近更新 更多