假设我有三个 C 静态库说的 libColor.a 的取决于* libRGB。*一而这又依赖于的 libPixel.a 。该库的 libColor.a 据说取决于库 libRGB.a 因为有一些在定义的符号中的 libColor.a 一些参考 libRGB.a 。如何所有上述库结合到一个新的 libNewColor.a 的是独立?

独立意味着新的库应具有定义的所有符号。因此,虽然连接我只是需要给 -lNewColor 。新库的大小应该是最小的即它不应该包含其中不使用由 libColor.a 等中的 libRGB.a 的任何符号 我在使用各种选项尝试自己的运气 AR 命令(用于创建和更新静态库/存档)。

有帮助吗?

解决方案

1 /提取所有从每个文库(使用ar)目标文件并试图编译代码而不库或任何目标文件。你可能会得到未定义符号的绝对斗负荷。如果你没有未定义的符号,则转到步骤5。

2 /抓斗的第一个,并找出哪些对象,该对象符号(使用nm)文件满足。

3 /写下对象文件然后编译代码,包括新的对象文件。你会得到未定义符号的一个新的列表,或者,如果有没有,转到第5步。

4 /转到步骤2。

5 /(与ar再次)将所有的目标文件在列表中(如果有的话)到一个库。

砰!你有它。尝试不使用任何对象的链接您的代码,但的新库。

此整个事情可以相对容易地与外壳脚本自动进行。

其他提示

在GNU归档的一个很少使用的功能是归档脚本,它是一个简单但功能强大的接口,它可以做的正是你想要的东西,例如,如果下面的脚本被称为script.ar:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
SAVE
END

然后可以按如下方式调用AR:

ar -M < script.ar

和你会得到libNewColor.a包含所有从libColor.a libRGB.a和libPixel.a .o文件的。

此外,还可以添加常规.o文件以及与ADDMOD命令:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
ADDMOD someRandomCompiledFile.o
SAVE
END

此外,它是超级容易产生在生成文件这些脚本,所以通常会创建用于创建这实际上产生脚本,并调用脚本AR档案稍微通用生成文件规则。是这样的:

$(OUTARC): $(OBJECTS)
    $(SILENT)echo "CREATE $@" > $(ODIR)/$(ARSCRIPT)
    $(SILENT)for a in $(ARCHIVES); do (echo "ADDLIB $$a" >> $(ODIR)/$(ARSCRIPT)); done
    $(SILENT)echo "ADDMOD $(OBJECTS)" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "SAVE" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "END" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)$(AR) -M < $(ODIR)/$(ARSCRIPT)

虽然现在我看它我猜它不工作,如果$(对象)是空的(也就是说,如果你只是想档案馆无需添加额外的对象文件相结合),但我会离开它作为一个练习的读者如果需要解决这个问题...:d

下面是该文档对于此功能:

https://sourceware.org/binutils/docs/binutils/ar-scripts html的#AR-脚本

一个静态库是不大于一些对象文件的存档得多(的.o)。你可以做的是提取这两个库中的所有对象(使用“AR X”),然后使用“AR”他们在新的库链接在一起。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top