1

我注意到调用ObjectLibrary构建器有时会在最后使用可选参数,例如

Object('hello.c', CCFLAGS='-DHELLO')
Object('goodbye.c', CCFLAGS='-DGOODBYE')

CanObject和all 采用任意一组LibrarySharedLibrary还是仅限于一组特定的变量?如果是这样,我希望这应该可以节省我们当前在工作中构建的非常大的 SCons。

4

2 回答 2

2

C/C++ 构建器识别一组特定的参数,称为构造变量

这些变量可以在环境中设置,也可以在调用构建器时设置,就像您在问题中所做的那样。在环境中设置它们通常更容易,从而使对构建器的调用更简单,然后只在必要时修改变量。

这是一个例子:

env = Environment()

# Notice that CPPPATH, CPPDEFINES, LIBS, and LIBPATH dont include the
# compiler flags -I, -D, -l, and -L respectively, SCons will add those
# in a platform independent manner
env.Append(CCFLAGS=['-g', '-O2'])
env.Append(CPPPATH=['some/include/path'])
env.Append(CPPDEFINES=['YOUR_DEFINE'])
env.Append(LIBS=['pthread'])
env.Append(LIBPATH=['some/lib/path'])

# All of these builder calls use the construction  
# variables set on the environment above
env.Object('hello.c')
env.Object('goodbye.c')
env.Program('main.cc')

如果要覆盖特定变量,可以执行以下操作

env.Object('hello.c', CPPDEFINES='HELLO')

或者,如果您想附加到特定变量,只需一次调用,您可以执行以下操作:

env.Object('hello.c', CPPDEFINES=[env['CPPDEFINES'], 'HELLO'])
于 2014-04-23T05:40:25.003 回答
0

布雷迪所说的大部分是正确的。但是,您可以将任何(数量)Environment() 变量附加到任何构建器的末尾。这些创建了一个 OverrideEnvironment(),然后用于运行构建器。

如果您要更改 CCCOM 的值和/或任何输入命令行以运行编译器的变量,那么将这些变量添加到构建器调用也会产生一些影响。

如果您指定一个对当前构建器没有影响的变量,或者甚至是一个未在 SCons 中的任何位置定义的变量,或者您可能创建的任何构建器,SCons 都不会发出警告或错误。

于 2016-02-05T04:58:55.030 回答