Scons 选择哪个版本的 g++ |无法识别的命令行选项"-std=c++11"

which version of g++ does Scons pick | unrecognized command line option "-std=c++11"

本文关键字:命令行 识别 选项 c++11 -std 选择 版本 g++ Scons      更新时间:2023-10-16

我在OpenSUSE中使用Scons 2.3.0时遇到问题:

当我添加"-std=c++11"选项时,我看到了错误

cc1plus: error: unrecognized command line option "-std=c++11"

我意识到这是因为我的 g++ 版本太旧了(4.1(。所以我把它升级到4.7.1。下面的事情也做了

  1. 我将 g++4.7.1 的路径移到了 $PATH 中的第一个位置(在/usr/bin 之前(
  2. 当我尝试时

      which g++
    

    我看到它显示了我的新 g++4.7.1 的路径

  3. 当我尝试g++ -v时,我还看到了 4.7.1 版

  4. 不使用 scons,如果我尝试用 g++ -std=c++11 helloWorld.cpp 构建一个简单的 helloWorld,一切正常。

  5. 现在通过使用scons,我看到了cc1plus: error: unrecognized command line option "-std=c++11"

  6. 我什至在我的SConstruct文件中添加了s.system("g++ -v"),它仍然打印正确的版本(4.7.1(

所以我不确定我做错了哪一部分。

请给我一些建议

提前感谢您的帮助!

SCons选择旧版本的编译器作为默认值。

执行os.system("g++ -v")将使用您的 PATH,但 SCons 内部不使用 PATH 来查找编译器,它会在标准位置查找。

如果无法卸载旧版本的编译器,则可能需要显式指出新编译器。这可以通过在环境中设置一些构造变量来完成,如下所示:

env = Environment()
env.Replace(CXX='path/g++')
env.Replace(CC='path/gcc')

您可以在此处找到所有构造变量。

来自 https://scons.org/doc/2.3.4/HTML/scons-man.html

"SCONS 不会自动将用于执行 SCONS 的外部环境传播到用于构建目标文件的命令。这样,无论调用 scons 时设置的环境变量如何,都可以保证构建可重复。这也意味着,如果要用于生成目标文件的编译器或其他命令不在标准系统位置,则 scons 将找不到它们,除非您显式设置 PATH 以包含这些位置。无论何时创建 scons 构造环境,都可以从外部环境传播 PATH 的值,如下所示:" ...

"导入操作系统env = Environment(ENV = os.environ(">

我发现当使用 scons 和 scl devtoolset 时,最初的 scons 脚本

将使用正确的 g++/gcc 版本,但任何依赖的 scons 脚本都会使用默认的而不是当前的 devtoolset。 对环境进行上述更改解决了该问题。