【问题标题】:How to link with static libraries using SCons?如何使用 SCons 链接静态库?
【发布时间】:2016-02-15 09:22:54
【问题描述】:

我正在尝试通过以下方式链接使用 SCons 创建的静态库:

//LIBSUFFIX and PREFIX are already set
env.Replace(LINKCOM = '$LINK $LINKOPTFILE $LINKMIXEDOPTIONS $LINKERR $LINKMAPFILE $SOURCES $LINKFILE $_LIBDIRFLAGS $_LIBFLAGS -o $TARGET')
env.Library('libraryname', ['file1.o','file2.o'])
env.Program(target = '', LIBS = 'libraryname', LIBPATH = 'path', source = Glob(*.c))

我的问题如下:在 LINKCOM 中,添加的库没有位置,例如:libraryname.a。此外,已包含在库中的文件也将传递给链接器命令(例如 SCons 无法识别我正在从它们创建库)

ex:我必须从以下来源创建一个程序: main.c s1.c s2.c s3.c 和 库library_s.a 来自s1.os2.o .

SCons 传递的链接器命令:

linker.exe linkerflags s1.o s2.o s3.o library_s.a -o target.exe

如何将_LIBDIRFLAGS 中的每个目录与其对应的库连接起来,以及如何让 SCons 知道我正在从某些源文件创建库?

编辑:链接器命令应该是这样的:

'linker.exe' linkerflags s3.o pathtolibrary/library_s.a -o target.exe

备注:因为 library_s.a 是从 s1.o 和 s2.o 创建的,所以我希望 SCons 仅通过 s3.o 和库

【问题讨论】:

  • 如果您删除带有“env.Replace(...)”的行,它会起作用吗?换句话说,SCons 的“智能链接方法”应该自动处理所有你想要的......为什么你必须用其他东西替换它?
  • 这是因为我正在使用另一个编译器/链接器,这是我工具实现的一部分
  • 那么输出应该是怎样的呢?仍然很难看出你在追求什么,因为在你显示的命令行和你在 SConstruct(s) 中所做的定义之间没有可见的链接......你没有显示环境设置的其余部分的外观喜欢。最后,您使用的是哪个链接器,是商业链接器吗?
  • 我添加了链接器命令的外观

标签: python c scons


【解决方案1】:

您可以简单地将完全需要的库路径添加到Program() 调用中:

lib_a = env.Library('libraryname', ['file1.c','file2.c'])
env.Program('target', ['main.c', 's3.c', 'pathtolibrary/' + str(lib_a[0])])

如果您告诉Glob() 查找所有 C 文件(“*.c”),它将返回完整列表。如果这不是您想要的,您必须手动过滤 Glob 调用的结果,或者使用自 v2.3.5 起可用的“排除”选项(仅适用于 VariantDirs,仅从 v2.3 中的相应修复开始。 4.1!)。

您对 SCons 如何运作的期望,关于自动检测 lib 的源文件和目标文件之间的依赖关系,与现实不符......不幸的是。通常会做的是重新构建构建,以便 lib 的所有 C 文件都位于与主要源代码不同的子文件夹中。然后你可以再次使用Glob(*.c) 并且不会有干扰源列表。请注意,如何将像 s2.o 这样的目标文件再次添加到最终链接步骤实际上可能是有意义的,例如在循环依赖的情况下......所以 SCons(或任何其他构建系统)无论如何都无法自行解决这个问题。解决这类问题总是需要用户的输入。

【讨论】:

    猜你喜欢
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多