gpt4 book ai didi

结合静态库

转载 作者:IT王子 更新时间:2023-10-29 00:26:07 26 4
gpt4 key购买 nike

假设我有三个 C 静态库,比如 libColor.a 依赖于 *libRGB.*a 而后者又依赖于 libPixel.a 。据说库 libColor.a 依赖于库 libRGB.a 因为在 libColor.a 中有一些引用定义在libRGB.a。我如何将上述所有库组合成一个新的独立的 libNewColor.a

独立意味着新库应该定义所有符号。因此,在链接时我只需要提供 -lNewColor。新库的大小应该是最小的,即它不应该包含 libRGB.a 中没有被 libColor.a 等使用的任何符号。我在 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 文件。

此外,您还可以使用 ADDMOD 命令添加常规 .o 文件:

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

此外,在 Makefile 中生成这些脚本非常容易,因此我通常创建一个有点通用的 makefile 规则来创建实际上生成脚本并在脚本上调用 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)

虽然现在我看了它,但我想如果 $(OBJECTS) 是空的(即如果你只是想合并文件而不添加额外的目标文件)它不起作用,但我会把它留给读者作为练习如果需要解决该问题... :D

以下是此功能的文档:

https://sourceware.org/binutils/docs/binutils/ar-scripts.html#ar-scripts

关于结合静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/665752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com