Tho*_*mas 2 scons static-libraries
我正在尝试使用 scons 将静态库 [1] 链接到另一个静态库 [2]。
不幸的是,发出的对“ar”的调用从不包含任何到库 [1] 的路径。
根据这篇文章如何将两个“ar”静态库合并为一个,应该可以将档案合并为一个。
在这里通常调用 CheckLibWithHeader 是不够的吗?
此致
在使用 SCons ar 命令引用库 [1] 时,您是否尝试过指定库 [1] 的完整路径?
布雷迪
在我的原始答案中添加更多信息:由于您尚未发布 SCons 脚本,我将假设它类似于我在下面展示的内容:
通常,LIBPATH 构造变量用于指定库的路径,但这似乎只适用于 Program() 构建器,而不适用于 ar 命令。然后需要做的是指定相关库的完整路径。假设我有以下目录结构:
# tree .
.
|-- SConstruct
|-- fileA.cc
|-- fileA.o
|-- libB
| `-- libmoduleB.a
|-- libmoduleA.a
`-- libmoduleC.a
Run Code Online (Sandbox Code Playgroud)
这是显示如何执行此操作的 SConscript:
env = Environment()
env.Library(target = 'moduleA', source = 'fileA.cc')
env.Library(target = 'moduleC', source = ['libmoduleA.a', '#libB/libmoduleB.a'])
Run Code Online (Sandbox Code Playgroud)
或者,您可以指定绝对路径,而不是相对目录 '#libB'。(路径中的“#”表示它相对于 SConscript)
而且,为了使其可移植,您应该像这样指定 moduleB 库(和 moduleA):
libBname = "%smoduleB%s" % (env['LIBPREFIX'], env['LIBSUFFIX'])
libB = os.path.join(pathToLibB, libBname)
Run Code Online (Sandbox Code Playgroud)
结果如下:
# 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.
Run Code Online (Sandbox Code Playgroud)