在使用scons时,如何向gcc传递--start-group和--end-group标志?

4
在scons中,如何实现--start-group和--end-group gcc标志?这些应该包装特定的LIBS集,但我找不到一个PREFIX / SUFFIX选项,可以将整个(或部分)输入到LIBS包装起来。
如果您想知道我所说的gcc标志是什么,请阅读此处: GCC: what are the --start-group and --end-group command line options?

你搜索了scons用户组邮件列表的存档吗?我认为这个问题已经被解决了。虽然不简单,但是可以完成。通常这意味着你有递归依赖项,并且需要解决这个混乱的问题...是否是这种情况? - bdbaddog
1个回答

6

您说得对,这个包装器没有内置的前缀/后缀。指定传递给链接命令的库列表的命令行选项是基于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变量,并在附加到LINKCOM的一个单独变量中复制_LIBFLAGS函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接