【发布时间】:2011-05-22 21:43:28
【问题描述】:
.o 文件和 .lib 文件有什么区别?
【问题讨论】:
-
指的是什么?文件格式?用法?来源?
标签: c
.o 文件和 .lib 文件有什么区别?
【问题讨论】:
标签: c
从概念上讲,编译单元(源文件/目标文件中的代码单元)要么完全链接,要么根本不链接。虽然 一些 实现,在编译器和链接器之间有相当程度的合作,能够在链接时从目标文件中删除未使用的代码,但它并没有改变包含 2 个具有冲突符号的编译单元的问题程序中的名称是错误的。
作为一个实际示例,假设您的库有两个函数foo 和bar,它们一起在一个目标文件中。如果我想使用bar,但我的程序已经有一个名为foo 的外部符号,我就会遇到错误。即使实现或如何为我解决此问题,代码仍然不正确。
另一方面,如果我有一个包含两个单独目标文件的库文件,一个带有foo,另一个带有bar,则只有包含bar 的一个会被拉入我的程序。
在编写库时,应避免在同一个目标文件中包含多个函数,除非必须将它们一起使用。这样做会使链接库(静态)的应用程序膨胀并增加符号冲突的可能性。就我个人而言,当有疑问时,我更喜欢在单独的文件方面犯错 - 如果 foo_create 和 foo_free 放在单独的文件中是非常有用的,那么它们甚至是有用的,这样不需要调用 @ 的简短的一次性程序987654330@ 可以避免拉入代码进行深度释放(甚至可能避免拉入free 本身的实现)。
【讨论】:
.LIB 文件是 .OBJ 的集合 文件连接在一起 指数。应该没有区别 链接器如何处理。
引用自这里:
What is the difference between .LIB and .OBJ files? (Visual Studio C++)
【讨论】:
它们实际上完全不同,特别是对于较旧的链接器。
.o(或 .obj)文件是目标文件,它们包含编译器生成代码的输出。它仍然处于中间格式,例如,大多数引用仍未解决。通常源文件和目标文件是一一对应的。
.a(或 .lib)文件是档案,也称为库,是一组目标文件。
所有操作系统都有允许您将目标文件添加/删除/列出到库文件的工具。
另一个区别,特别是旧链接器,是链接文件时如何处理文件。一些链接会将完整的目标文件放入最终的二进制文件中,而不管实际使用的是什么,而它们只会从库文件中提取有用的信息。
如今,大多数链接器都足够聪明,可以删除所有未使用的内容。
【讨论】: