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