.o文件和.lib文件有什么区别?

时间:2010-12-09 14:26:01

标签: c

.o文件和.lib文件有什么区别?

3 个答案:

答案 0 :(得分:12)

从概念上讲,编译单元(源文件/目标文件中的代码单元)要么完全链接要么根本不链接。虽然某些实现,在编译器和链接器之间具有显着的协作水平,但能够在链接时从目标文件中删除未使用的代码,但它不会改变包含2个具有冲突符号的编译单元的问题程序中的名称是错误的。

作为一个实际示例,假设您的库有两个函数foobar,它们一起位于目标文件中。如果我想使用bar,但我的程序已经有一个名为foo的外部符号,我就会遇到错误。即使实现可能能够为我解决这个问题,代码仍然是错误的。

另一方面,如果我的库文件包含两个单独的目标文件,一个包含foo而另一个包含bar,则只有包含bar的文件将被拉入我的计划。

编写库时,应避免在同一目标文件中包含多个函数,除非它们必须一起使用。这样做会使链接您的库(静态)的应用程序膨胀,并增加符号冲突的可能性。就个人而言,当有疑问时,我更喜欢在单独的文件方面犯错误 - 将foo_createfoo_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)文件是存档,也称为库,是一组目标文件。

所有操作系统都有工具,允许您添加/删除/列出目标文件到库文件。

另一个区别,特别是与旧链接器有关的是链接文件时如何处理文件。有些链接会将完整的目标文件放入最终的二进制文件中,而不管实际使用的是什么,而它们只会从库文件中提取有用的信息。

如今,大多数链接器都足够聪明,可以删除所有未使用的内容。