使用Clang的scan-build与scons和C++11一起使用

14

我已经将所有东西添加到我的$PATH中,并根据这些答案[ 1, 2, 3 ]调整了我的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

我不能仅仅使用未修改的SConstruct文件在scons上运行scan-build


@Industrial-antidepressant,我已经按照Greg的建议使用了环境变量。我可以通过Clang和SCons正常构建,但我无法运行静态分析器 - chrisaycock
@Industrial-antidepressant,“--use-analyzer”不是“scan-build”的已识别选项。 - chrisaycock
该选项是在2012年8月24日23:08:08添加到clang中的,提交消息为“重新设计scan-build选择用于静态分析的clang版本的方式”,并随clang 3.2一起发布。 - Industrial-antidepressant
@Industrial-antidepressant,我终于得到了Clang 3.2并尝试了--use-analyzer。但我仍然遇到了相同的错误。不过还是谢谢你。 - chrisaycock
有趣的是...我手动编译并安装了clang,出现了相同的错误信息,但我没有使用scons,而是使用了一个类似的工具,叫做waf。我必须使用--use-analyzer=/path/to/clang,并且该路径必须包含二进制文件本身,而不仅仅是路径。 - Industrial-antidepressant
显示剩余2条评论
2个回答

5
问题在于执行环境(Wayback Machine)中没有clang的搜索路径。这就解释了为什么添加env["ENV"]["PATH"] = os.environ["PATH"]这一行代码可以解决该问题。
要在未修改的SConstruct上运行scan-build,你需要将clang可执行文件(clang++和可能的clang)放在执行环境使用的搜索路径上,例如在Linux上通过从/usr/bin/clang++创建一个符号链接到你的/path/to/clang++

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-diagnostics,而 gcc 不会接受这个命令。

修改:我应该指出这里的“scan-build -v -v -v”仅显示了很少量的信息,并且没有帮助。 - Joseph Quinsey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接