如何使用SCons链接静态库?

时间:2016-02-15 09:22:54

标签: python c scons

我试图通过以下方式链接使用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中添加的库没有其位置ex:libraryname.a。此外,已经包含在库中的文件也会传递给链接器命令(就像SCons没有认识到我正在创建一个库)

例如:我必须从以下来源创建一个程序: main.c s1.c s2.c s3.c和 来自library_s.as1.o的图书馆s2.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和库

1 个答案:

答案 0 :(得分:1)

您只需将完全要求的lib路径添加到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.4.1中的相应修订开始!)。

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