【问题标题】:How to get the object file in a static library with scons如何使用 scons 在静态库中获取目标文件
【发布时间】:2014-04-29 10:35:21
【问题描述】:

我正在使用 scons 来构建我的项目。现在我遇到了问题。

我用
env.StaticLibrary('a', [a1.o, a2.o])
获取静态库“liba.a”。

现在我将“liba.a”传递给我项目的另一部分,在该部分中,我将生成另一个名为“libb.a”的静态库,这会将“liba.a”与其他一些目标文件合并。

代码如下:
env.StaticLibrary('b', ['liba.a', 'b1.o', 'b2.o'] )

在这个问题中 Linking static libraries, that share another static library 我们知道不能简单地将一个静态库合并到另一个静态库中,因为这可能会导致一些符号问题。

现在我想用这种方式解决这个问题:

首先获取'liba.a'的目标文件。然后将此目标文件与新的目标文件合并以生成最终的“libb.a”。

但我发现我找不到方法或函数来使用 scons 获取静态库中的目标文件。

谁能帮帮我?

【问题讨论】:

    标签: static-libraries scons


    【解决方案1】:

    听起来您只想对 2 个不同的库使用相同的目标文件。

    你可以这样做:

    env = Environment()
    
    env.StaticLibrary('a', ['a1.o', 'a2.o'])
    env.StaticLibrary('b', ['b1.o', 'b2.o', 'a1.o', 'a2.o'])
    

    此外,您可以直接指定源文件,而不是处理目标文件。在这种情况下,SCons 只会根据需要编译一次源文件。

    env.StaticLibrary('a', ['a1.c', 'a2.c'])
    env.StaticLibrary('b', ['b1.c', 'b2.c', 'a1.c', 'a2.c'])
    

    另外,请记住,每个 SCons 构建器都会返回一个目标列表(每个都是一个 SCons 节点)。该列表可能有一个或多个条目。因此,例如,以下目标变量将包含库目标以及构建的所有对象:

    target = env.StaticLibrary('a', ['a1.c', 'a2.c'])
    for t in target: print str(t)
    

    【讨论】:

    • 感谢您的回答,很有帮助。我想再问你一个问题:你能把静态库解压成 SCons 中的一些目标文件吗?我的意思是喜欢命令“ar -x liba.a”。
    • @lee,您可以使用 Command() 构建器或调用 os.system() 来完成。使用“AR”构造变量来获取“ar”二进制文件。我不明白你为什么要这样做,考虑到用于创建库的对象是可用的,或者在与源文件相同的目录中,或者如果您使用的是 variant_dir,请在其中。
    • 再次感谢您。我也不想这样做,但是在我的公司,我只是接手了一个产品,而在这个产品中,其他人只是将静态库传递给我,我需要在内部创建一个新的静态库前一个。更糟糕的是,我无法访问前者的目标文件。
    • ,我找到了获取静态库源文件的方法。我已经阅读了 SCons.Node.Node 源代码,我发现它有一个属性——来源。它是一个包含目标文件地址的列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    相关资源
    最近更新 更多