在scons中将访问说明符从private更改为public

Changing access specifiers from private to public in scons?

本文关键字:private public 说明符 scons 访问      更新时间:2023-10-16

我使用scons构建了一个大型项目,最终在SConstruct文件中发现了一行导致了我之前在这里发布的编译错误:sstream重新声明为公共访问编译器错误

这是SConctruct文件中的一行:

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

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

jailbreak_env = env.Clone(CPPDEFINES=[])

然而,我不知道这个修复是如何工作的,甚至不知道如何在c++中更改访问说明符?我花了一些时间研究SCons,了解到Clone()只是创建了一个新的程序"越狱版本",但通过使用CPP_DEFINES变量大幅更改c++编译器环境。但是scons文档(http://www.scons.org/doc/0.96.90/HTML/scons-user/a3061.html)对于CPP_DEFINES,是否提及如上所示用于更改访问说明符?

欢迎任何关于我应该在哪里寻求解释的想法或建议。

您上面提到的SCons文档的链接明确表示(搜索CPPDEFINE关键字):

如果$CPPDEFINES是一个列表,则$CPPDEFPREFIX和$CPPDEFSUFFIX构造变量将附加到开头以及列表中每个元素的末尾。如果任何元素是列表或元组,则第一项是要定义的名称,第二项是项就是它的价值。

您的元组

('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.