使用 scons 的扫描构建使用 gcc 而不是 clang
scan-build using scons uses gcc instead of clang
我试图让 scan-build
使用 clang 而不是 gcc 进行编译,但由于某些原因 scons
总是使用 gcc。
如果我执行 scons
,我得到:
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
/usr/bin/clang++ -o src/game.o -c -std=c++1z -pedantic -Wall -Wextra -Werror -O3 src/game.cpp
src/game.cpp:13:62: error: unknown type name 'a'
constexpr std::array<piece_t, game::pieces_num> game::pieces;a
^
src/game.cpp:15:7: error: constructor cannot have a return type
game::game() noexcept {
^~~~
src/game.cpp:16:5: error: use of undeclared identifier 'regen_pieces'
regen_pieces();
^
3 errors generated.
scons: *** [src/game.o] Error 1
scons: building terminated because of errors.
如您所见,它正确地使用了 clang++
而不是 g++
。我使用 this 问题中的答案实现了这一点。
但是,如果我执行 scan-build scons
,我会得到:
scan-build: Using '/usr/bin/clang-4.0' for static analysis
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
/usr/bin/../lib/clang/c++-analyzer -o src/game.o -c -std=c++1z -pedantic -Wall -Wextra -Werror -O3 src/game.cpp
src/game.cpp:13:62: error: 'a' does not name a type
constexpr std::array<piece_t, game::pieces_num> game::pieces;a
^
scons: *** [src/game.o] Error 1
scons: building terminated because of errors.
scan-build: Removing directory '/tmp/scan-build-2017-04-27-213151-27247-1' because it contains no reports.
scan-build: No bugs found.
由于报错信息不同,scan-build
使用了gcc而不是clang。
这是我的环境变量输出:
$ printenv | grep clang
CC=/usr/bin/clang
CXX=/usr/bin/clang++
还有我的 SConstruct
文件:
import os
env = Environment()
env["CC"] = os.getenv("CC") or env["CC"]
env["CXX"] = os.getenv("CXX") or env["CXX"]
env["ENV"].update(x for x in os.environ.items() if x[0].startswith("CCC_"))
env["ENV"]["TERM"] = os.environ["TERM"]
env.Append(CXXFLAGS = "-std=c++1z -pedantic -Wall -Wextra -Werror -O3")
env.Append(LIBS = ["pthread"])
env.Program("game", ["src/game.cpp", "src/main.cpp"])
所以,我的问题是如何让 scan-build
使用 clang?
如果您不指定编译器,scan-build
将不会读取环境变量,而是猜测。在你的情况下,它猜测合适的编译器是 gcc。
scan-build
的开发人员正在尝试解决此问题,但与此同时,您必须在构建时明确指定编译器:
$ scan-build --use-c++=clang++ scons
我试图让 scan-build
使用 clang 而不是 gcc 进行编译,但由于某些原因 scons
总是使用 gcc。
如果我执行 scons
,我得到:
scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... /usr/bin/clang++ -o src/game.o -c -std=c++1z -pedantic -Wall -Wextra -Werror -O3 src/game.cpp src/game.cpp:13:62: error: unknown type name 'a' constexpr std::array<piece_t, game::pieces_num> game::pieces;a ^ src/game.cpp:15:7: error: constructor cannot have a return type game::game() noexcept { ^~~~ src/game.cpp:16:5: error: use of undeclared identifier 'regen_pieces' regen_pieces(); ^ 3 errors generated. scons: *** [src/game.o] Error 1 scons: building terminated because of errors.
如您所见,它正确地使用了 clang++
而不是 g++
。我使用 this 问题中的答案实现了这一点。
但是,如果我执行 scan-build scons
,我会得到:
scan-build: Using '/usr/bin/clang-4.0' for static analysis scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... /usr/bin/../lib/clang/c++-analyzer -o src/game.o -c -std=c++1z -pedantic -Wall -Wextra -Werror -O3 src/game.cpp src/game.cpp:13:62: error: 'a' does not name a type constexpr std::array<piece_t, game::pieces_num> game::pieces;a ^ scons: *** [src/game.o] Error 1 scons: building terminated because of errors. scan-build: Removing directory '/tmp/scan-build-2017-04-27-213151-27247-1' because it contains no reports. scan-build: No bugs found.
由于报错信息不同,scan-build
使用了gcc而不是clang。
这是我的环境变量输出:
$ printenv | grep clang
CC=/usr/bin/clang
CXX=/usr/bin/clang++
还有我的 SConstruct
文件:
import os
env = Environment()
env["CC"] = os.getenv("CC") or env["CC"]
env["CXX"] = os.getenv("CXX") or env["CXX"]
env["ENV"].update(x for x in os.environ.items() if x[0].startswith("CCC_"))
env["ENV"]["TERM"] = os.environ["TERM"]
env.Append(CXXFLAGS = "-std=c++1z -pedantic -Wall -Wextra -Werror -O3")
env.Append(LIBS = ["pthread"])
env.Program("game", ["src/game.cpp", "src/main.cpp"])
所以,我的问题是如何让 scan-build
使用 clang?
如果您不指定编译器,scan-build
将不会读取环境变量,而是猜测。在你的情况下,它猜测合适的编译器是 gcc。
scan-build
的开发人员正在尝试解决此问题,但与此同时,您必须在构建时明确指定编译器:
$ scan-build --use-c++=clang++ scons