如何使用 SCons link 静态库?

How to link with static libraries using SCons?

我正在尝试 link 通过以下方式使用 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。库中已经包含的文件也被传递给 linker 命令(就像 SCons 无法识别我正在从它们创建库)

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

SCons 传递的链接器命令:

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

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

编辑: linker 命令应该是这样的:

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

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

您只需将您的库的完整所需路径添加到 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"),它将 return 完整列表。如果这不是您想要的,您必须手动或使用自 v2.3.5 以来可用的 "exclude" 选项过滤 Glob 调用的结果(仅适用于以相应的开头的 VariantDirs在 v2.4.1 中修复!)。

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