使用 scons 时如何将 --start-group 和 --end-group 标志传递给 gcc?
How do you pass the --start-group and --end-group flags to gcc when using scons?
在 scons 中,如何实现 --start-group 和 --end-group gcc 标志?这些应该包装一组特定的 LIBS,但我找不到 PREFIX/SUFFIX 将整个(或部分)输入包装到 LIBS 的选项。
如果您想知道我在说什么 gcc 标志,请在此处阅读更多内容:
GCC: what are the --start-group and --end-group command line options?
您说得对,prefix/suffix 没有内置此包装器。指定传递给 link 命令的库列表的命令行选项是根据 LIBS
环境变量计算的,并存储在 _LIBFLAGS
环境变量中。 _LIBFLAGS
然后用作完整的 linker 命令行的一部分。
在 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.
如果您只想对库的一个子集进行分组,则必须对 "wrapped" 和 "unwrapped" 库使用单独的 LIBS
变量并复制 _LIBFLAGS
附加到 LINKCOM
.
的单独变量中的函数
在 scons 中,如何实现 --start-group 和 --end-group gcc 标志?这些应该包装一组特定的 LIBS,但我找不到 PREFIX/SUFFIX 将整个(或部分)输入包装到 LIBS 的选项。
如果您想知道我在说什么 gcc 标志,请在此处阅读更多内容:
GCC: what are the --start-group and --end-group command line options?
您说得对,prefix/suffix 没有内置此包装器。指定传递给 link 命令的库列表的命令行选项是根据 LIBS
环境变量计算的,并存储在 _LIBFLAGS
环境变量中。 _LIBFLAGS
然后用作完整的 linker 命令行的一部分。
在 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.
如果您只想对库的一个子集进行分组,则必须对 "wrapped" 和 "unwrapped" 库使用单独的 LIBS
变量并复制 _LIBFLAGS
附加到 LINKCOM
.