【问题标题】:How do you pass the --start-group and --end-group flags to gcc when using scons?使用 scons 时如何将 --start-group 和 --end-group 标志传递给 gcc?
【发布时间】:2016-06-28 05:37:27
【问题描述】:

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

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

GCC: what are the --start-group and --end-group command line options?

【问题讨论】:

  • 您是否搜索过 scons 用户组邮件列表存档。我想这已经被覆盖了。这并不简单,但可以做到。通常这意味着你有递归依赖,需要这个来解开这个烂摊子……是这样的吗?

标签: gcc scons


【解决方案1】:

你说得对,这个包装器没有内置前缀/后缀。指定传递给链接命令的库列表的命令行选项基于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@.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-16
    • 2011-08-04
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    相关资源
    最近更新 更多