2012-03-20 212 views
1

我试图用scons将静态链接库[1]链接到另一个静态库[2]。将静态库链接到另一个静态库

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

根据这篇文章How to merge two "ar" static libraries into one它应该是可以合并成一个归档。

通常调用CheckLibWithHeader在这里不够吗?

问候

+0

不能将静态库链接到另一个静态库。您可以将静态库的内容包含在另一个静态库中。 (假设非Windows)。你甚至可以链接到执行此操作所需的命令示例。 – bdbaddog 2017-01-14 20:36:27

回答

3

你试过指定到库的完整路径[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. 
+0

嗨布雷迪,我绑env.Append(LINKFLAGS = [' - lLibrary1'])以及.CheckLibWithHeader(...),但ar-命令永远不会改变。多谢,托马斯。 – Thomas 2012-03-20 14:10:20

+0

你能不能请示SCons脚本。 – Brady 2012-03-20 14:16:37

+0

感谢您的非常详细的答案 - 它解决了! – Thomas 2012-03-21 12:40:57

0

你需要创建运行在其它的命令建设者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) 

类似上面的东西应该工作。

相关问题