我已将所有内容添加到$PATH
,我已调整SConstruct
来设置相应的环境变量,根据这些答案[1,2, 3]。现在我跑的时候
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-build
在scons
上运行SConstruct
。
答案 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-diagnostics
,gcc
不会接受。