使用Clang的扫描构建与scons和C ++ 11

时间:2012-12-06 19:32:04

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

我已将所有内容添加到$PATH,我已调整SConstruct来设置相应的环境变量,根据这些答案[123]。现在我跑的时候

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

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

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

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

could not find clang line

当分叉进程不包含字符串c++-analyzer时,-cc1会发生此错误。但如果我查看ps aux,我会清楚地看到

/path/to/clang -cc1 ...

程序如何正确构建,但静态分析器会失败?


供参考,如果我手动运行

scan-build clang++ <parameters from scons>

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

我也可以通过添加

来“欺骗”
env["ENV"]["PATH"] = os.environ["PATH"]

然后运行

CXX="scan-build clang++" scons

我无法使用未经修改的scan-buildscons上运行SConstruct

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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 不会接受。