将静态库链接到另一个静态库
问题描述:
我试图用scons将静态链接库[1]链接到另一个静态库[2]。将静态库链接到另一个静态库
不幸的是,对“ar”发出的调用从不包含库[1]的任何路径。
根据这篇文章How to merge two "ar" static libraries into one它应该是可以合并成一个归档。
通常调用CheckLibWithHeader在这里不够吗?
问候
答
你试过指定到库的完整路径[1]指的是它与利用Scons ar命令的时候?
布雷迪
添加更多的信息,以我原来的答复: 既然你还没有发布的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.
答
你需要创建运行在其它的命令建设者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)
类似上面的东西应该工作。
不能将静态库链接到另一个静态库。您可以将静态库的内容包含在另一个静态库中。 (假设非Windows)。你甚至可以链接到执行此操作所需的命令示例。 – bdbaddog 2017-01-14 20:36:27