【问题标题】:Link static library against another static library将静态库链接到另一个静态库
【发布时间】:2012-03-20 13:23:28
【问题描述】:

我正在尝试使用 scons 将一个静态库 [1] 链接到另一个静态库 [2]。

不幸的是,对“ar”的调用从未包含任何到库 [1] 的路径。

根据这篇帖子How to merge two "ar" static libraries into one 应该可以将档案合并为一个。

这里对 CheckLibWithHeader 的通常调用是否不够?

最好的问候

【问题讨论】:

  • 您不能将一个静态库链接到另一个静态库。您可以将静态库的内容包含在另一个静态库中。 (假设非 Windows)。您甚至还链接到了执行此操作所需的命令示例。

标签: static-libraries scons


【解决方案1】:

您是否尝试在使用 SCons ar 命令引用库 [1] 时指定其完整路径?

布雷迪

在我的原始答案中添加更多信息: 由于您还没有发布您的 SCons 脚本,我假设它类似于我在下面展示的那个:

通常,LIBPATH 构造变量用于指定库的路径,但它似乎只适用于 Program() 构建器,而不适用于 ar 命令。然后需要做的是指定相关库的完整路径。假设我有以下目录结构:

# tree .
.
|-- SConstruct
|-- fileA.cc
|-- fileA.o
|-- libB
|   `-- libmoduleB.a
|-- libmoduleA.a
`-- libmoduleC.a

这是显示如何执行此操作的 SConscript:

env = Environment()
env.Library(target = 'moduleA', source = 'fileA.cc')
env.Library(target = 'moduleC', source = ['libmoduleA.a', '#libB/libmoduleB.a'])

或者,您可以指定绝对路径,而不是相对目录“#libB”。 (路径中的“#”表示相对于 SConscript)

并且,为了使其可移植,您应该像这样指定 moduleB 库(和 moduleA):

libBname = "%smoduleB%s" % (env['LIBPREFIX'], env['LIBSUFFIX'])
libB = os.path.join(pathToLibB, libBname)

结果如下:

# scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o fileA.o -c fileA.cc
ar rc libmoduleA.a fileA.o
ranlib libmoduleA.a
ar rc libmoduleC.a libmoduleA.a libB/libmoduleB.a
ranlib libmoduleC.a
scons: done building targets.

【讨论】:

  • 嗨,布雷迪,我绑定了 env.Append(LINKFLAGS=['-lLibrary1']) 以及 .CheckLibWithHeader(...) 但 ar 命令永远不会改变。非常感谢,托马斯。
  • 对不起,但我认为这不起作用。这将创建一个包含 to .a 文件的库,但 ld 不理解它们,因为它们不是目标文件,并且每当您尝试与此库链接时都会引发错误...
【解决方案2】:

您需要创建一个构建器来运行您已链接到的另一个 SO question 中的命令。

ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a  *.o

尽管您可能需要一个扫描器来查找每个静态库 (ar t libabc.a) 中包含的文件,然后将其输出用作普通静态库构建器的输入。

ofiles = env.unArchive('libabc.a')
ofiles.extend(env.unArchive('libxyz.a'))

env.StaticLibrary('az',ofiles)

上面的方法应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2012-07-29
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多