使用scons时如何将--start-group和--end-group标志传递给gcc?

rke*_*emp 3 gcc scons

在scons中,如何实现--start-group和--end-group gcc标志?这些应该包装一组特定的LIBS,但是我找不到将全部(或部分)输入包装到LIBS的PREFIX / SUFFIX选项。

如果您想知道我在说什么gcc标志,请在此处阅读更多信息:

GCC:--start-group和--end-group命令行选项是什么?

Dav*_*her 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__)}'
Run Code Online (Sandbox Code Playgroud)

假设要包装整个库集,那么在您的环境中,您可以编辑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')
Run Code Online (Sandbox Code Playgroud)

我认为编辑的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.
Run Code Online (Sandbox Code Playgroud)

如果您只希望对库的子集进行分组,则必须LIBS对“包装”和“未包装”的库使用单独的变量,并_LIBFLAGS在附加到的单独变量中复制该函数LINKCOM