在scons中将访问说明符从私有更改为公共?

时间:2017-12-19 18:30:45

标签: c++ compiler-errors scons

我使用scons构建一个大型项目,最后在SConstruct文件中找到一行导致我之前发布的编译错误: sstream redeclared with public access compiler error

以下是SConctruct文件中的行:

jailbreak_env = env.Clone(CPPDEFINES=[('protected','public'),('private','public')])

如果您查看错误消息的链接,该链接会在sstream库中重新定义访问说明符,那么当我编辑SConstruct行时,该错误就不再出现了:

jailbreak_env = env.Clone(CPPDEFINES=[])

但是我无法弄清楚这个修复程序究竟是如何工作的,甚至是如何在c ++中更改访问说明符的?我花了一些时间研究SCons,我了解到Clone()只是创建了一个新的程序“越狱版本”,但是通过使用CPP_DEFINES变量彻底改变了c ++编译器环境。但CPP_DEFINES的scons文档(http://www.scons.org/doc/0.96.90/HTML/scons-user/a3061.html)没有提到用于更改访问说明符,如上所示?

欢迎任何有关我应该寻求解释的想法或指示。

1 个答案:

答案 0 :(得分:1)

link into SCons' documentation that you mention above明确声明(搜索CPPDEFINE关键字):

  

如果$ CPPDEFINES是一个列表,那么$ CPPDEFPREFIX和的值   $ CPPDEFSUFFIX构造变量将附加到开头   和列表中每个元素的结尾。如果任何元素是列表或   元组,然后第一项是定义的名称和第二项   item是它的价值。

你的元组

('protected','public')

将简单地作为

传递给预处理器/编译器
-Dprotected=public

,它将适用于给定的任何字符串。对于这个访问说明符没有什么特别之处,你应该在构建的输出中看到给定编译器的定义(除非你重新定义了SCons构建步骤的标准输出)。

您可以创建以下两个简单文件

SConstruct
==========

env = Environment(CPPDEFINES=[('foo','bar')])
env.Program('main', 'main.cxx')

main.cxx
========

int main(void)
{
  return 0;
}

当他们调用“scons”时,你得到预期的输出(在Linux下):

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o main.o -c -Dfoo=bar main.cxx
g++ -o main main.o
scons: done building targets.