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

Tho*_*mas 2 scons static-libraries

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

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

根据这篇文章如何将两个“ar”静态库合并为一个,应该可以将档案合并为一个。

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

此致

Bra*_*ady 5

在使用 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)

  • 抱歉,但我认为这不起作用。这将创建一个包含 .a 文件的库,但 ld 不理解它们,因为它们不是目标文件,并且每当您尝试链接该库时都会引发错误... (2认同)