我的一位同事昨天告诉我,构建libfoo.a不需要所有的功能,只要您要建立一个可执行文件的可执行文件这定义了缺少参考。
他说,档案只是带有索引的对象文件的集合,并且由于可以使用不定义的参考来构建对象文件,因此可以归档。
。这是真的吗?如果是这样,这是否暗示仅在链接阶段执行参考分辨率(即从未在编译或归档中)?
非常感谢..编译器是GCC,顺便说一句,语言为c/c
是的,所有这些都是正确的。您似乎知道libfoo.a
是ar
存档。ar
是GNU通用档案馆。归档内容很高兴您的文档,图片和/或音乐文件夹作为对象集合文件。
外部符号分辨率是链接:它是链接的核心业务,也是链接仅由链接器完成。如果ar
应该解析存档中对象文件的外部符号引用,则ar
,像链接器一样,需要命令选项来指定外部库要搜索哪些符号定义以及其中的目录这些库将被搜索。它没有。
ar
存档可以用作链接器输入文件。在这种情况下,链接器将在存档中搜索任何提供未解决的定义的对象文件从已经消耗的对象文件中计入的符号引用。它会根本不在乎档案中的其他类型的文件,带有或没有对象文件。如果它找到了定义未解决引用的任何对象文件,则提取它们从档案中从档案中添加到链接,就像它们单独一样在命令行中指定,完全没有提及档案。因此,唯一的角色链接中的档案是一袋对象文件,链接器可以从中选择一个对象文件它需要继续。
如果我们知道合适的袋子来提供链接器,我们将不知道很难知道链接中的哪个对象文件确切需要。那就是有用的静态库。原则上,任何档案格式都可能已被采用(.tar
,.gz
...),但是ar
是第一个该领域不受不需要的功能(目录序列化,压缩...)的负担,并且是历史的选择。顺便说一下,Microsoft LIB
格式与ar
格式相同。
对于在链接器服务中的角色,GNU ar
已经专业了一点对于对象文件的存在。s
选项 - 默认值,可由 S
-用空的文件名和数据添加一个假文件链接器能够从存档中的任何对象文件定义的全局符号中读取为查找表这些对象文件的名称和位置。以前(在ar
的非gnu变体中)通过运行单独的程序,ranlib
在档案中,使链接器可以访问它。注入ranlib表是使链接器从存档中选择所需的对象文件的原因。这些对象文件带来的任何未定义的引用均用于链接到像往常一样从对象文件或库随后消耗的问题。
您的问题的措辞表明您可能存在"存档"的印象 - 例如创建libfoo.a
-是可以调用的过程之一,例如编译通过GCC前端(gcc
,g++
,gfortran
等),这不是所以。这些前端仅调用(一个或多个)预处理器,编译器,汇编程序和链接器。档案是用于传递对象文件的辅助便利性到链接器并使用ar
直接创建:
ar cr libfoo.a file.o...
完成此操作后,libfoo.a
中的未定义引用正是file.o ...
中的未定义引用。