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

4
我正在尝试使用scons将一个静态库[1]链接到另一个静态库[2]中。
不幸的是,发出的“ar”调用从未包含任何指向库[1]的路径。
根据这篇文章 (如何将两个“ar”静态库合并为一个),应该可以将两个归档文件合并为一个。
在这里,CheckLibWithHeader的通常调用是否不足?
此致敬礼

你不能将一个静态库链接到另一个静态库。但是,你可以将一个静态库的内容包含在另一个静态库中。(假设非Windows环境)。你甚至已经链接到了一个示例,展示了如何执行这些命令。 - bdbaddog
2个回答

4

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

Brady

为了补充我原来的答案,假设您的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.

嗨,Brady,我尝试了env.Append(LINKFLAGS = ['-lLibrary1'])以及.CheckLibWithHeader(...),但ar命令从未改变。非常感谢,Thomas。 - Thomas
2
抱歉,但我认为这不起作用。这将创建一个包含两个 .a 文件的库,但是 ld 不理解它们,因为它们不是对象文件,每当您尝试链接此库时都会引发错误... - thamurath

2

您需要创建一个构建器,该构建器运行您链接的另一个SO问题中的命令。

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)

类似上述内容应该可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接