我使用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)没有提到用于更改访问说明符,如上所示?
欢迎任何有关我应该寻求解释的想法或指示。
答案 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.