你说得对,这个包装器没有内置前缀/后缀。指定传递给链接命令的库列表的命令行选项基于LIBS 环境变量计算并存储在_LIBFLAGS 环境变量中。 _LIBFLAGS 然后用作完整链接器命令行的一部分。
在 SCons 库的 Tool/link.py 中定义的默认值如下所示:
env['LINKCOM'] = '$LINK -o $TARGET $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
env['_LIBFLAGS']='${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}'
假设您要包装整个库集,那么在您的环境中,您可以编辑 LINKCOM 或 _LIBFLAGS 变量以添加选项:
# SConstruct
env = Environment(
CC = 'gcc',
LINKCOM = '$LINK -o $TARGET $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS -Wl,--start-group $_LIBFLAGS -Wl,--end-group'
)
#env.Prepend(_LIBFLAGS="-Wl,--start-group ") # the trailing space is required
#env.Append(_LIBFLAGS=" -Wl,--end-group") # the leading space is required
env.Program('foo', ['foo.c'], LIBS='m')
我认为编辑LINKCOM 的侵入性较小。在我的简单示例中,这会生成:
$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o foo.o -c foo.c
gcc -o foo foo.o -Wl,--start-group -lm -Wl,--end-group
scons: done building targets.
如果您只想对库的一个子集进行分组,那么您必须为“包装”和“未包装”库使用单独的 LIBS 变量,并将 _LIBFLAGS 函数复制到附加到 @ 的单独变量中987654332@.