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

Changing access specifiers from private to public in scons?

我使用scons构建了一个大项目,最后在SConstruct文件中找到了导致编译错误的一行,我之前在这里贴过:

这是 SConctruct 文件中的行:

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

如果您在 link 中查看抱怨在 sstream 库中重新定义访问说明符的错误消息,当我像这样编辑 SConstruct 行时,该错误不再出现:

jailbreak_env = env.Clone(CPPDEFINES=[])

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

欢迎任何关于我应该在哪里寻找解释的想法或指示。

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

If $CPPDEFINES is a list, the values of the $CPPDEFPREFIX and $CPPDEFSUFFIX construction variables will be appended to the beginning and end of each element in the list. If any element is a list or tuple, then the first item is the name being defined and the second item is its value.

你的元组

('protected','public')

将简单地传递给 preprocessor/compiler 作为

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