将静态库链接到另一个静态库

时间:2012-03-20 13:23:29

标签: static-libraries scons

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

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

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

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

祝你好运

2 个答案:

答案 0 :(得分:3)

您是否尝试使用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.

答案 1 :(得分:1)

您需要创建一个构建器,用于运行您链接到的另一个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)

上述内容应该有效。