我正在尝试使用scons将静态库[1]链接到另一个静态库[2]。
不幸的是,对“ar”的发出调用从不包含库[1]的任何路径。
根据这篇文章How to merge two "ar" static libraries into one,应该可以将档案合并为一个。
这里对CheckLibWithHeader的通常调用是否不充分?
祝你好运
答案 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)
上述内容应该有效。