.o和.lo文件的区别

Difference between .a .o and .lo file

本文关键字:区别 文件 lo      更新时间:2023-10-16

C中的.a.o.lo文件有什么区别?

.o, .a, .lo和.so的区别

摘要
  • 。o通常是由编译器发出的非pic对象文件(在链接阶段之前)当与exe链接时,代码将包含在可执行文件中——我们在链接时绑定。
  • 通常是包含一个或多个的存档库。o文件[非pic]。当与exe链接时,特定的"*。"文件中的文件将被插入可执行文件。
  • 。lo通常是包含PIC代码的"库对象",无论是使用gcc -fPIC手工编译还是使用libtool
  • 。所以文件是"共享对象"文件。它们包含PIC对象。

注意:

  • 如果你需要静态可执行文件,那么使用"。"answers"。一个"文件。
  • 如果您需要/希望动态可执行文件在运行时与库绑定,请使用。Lo 。所以文件。

介绍

虽然我喜欢上面的答案,但它们不包括.a/archive library表单。因此,我将在这里讨论这三个问题,并添加一个额外的。So库格式。此外,在stackexchange的脉络中,我将使用更多的文本,以防链接断开(注意,我不需要参考链接)。

Filetype . o

编译时的

。O

文件是一个目标文件,其中包含编译器为目标平台发出的目标代码。创建。o 文件:
gcc -c filename.c     <==== creates filename.o

注意,这个例子没有创建位置无关代码(PIC)。我们认为这个对象可能包含在静态库或可执行文件中。也就是说,当我们用链接可执行文件时。O 文件,. O文件中的代码被插入到可执行文件中——它是在构建时绑定的,而不是在运行时绑定的。这意味着可以在不包含.o文件的情况下重新分发可执行文件。注意:是惯例。o文件被认为是非pic文件。我们通常用来命名PIC对象文件。lo 扩展。

文件类型。

。a文件类型是"archive"库。它包含一个或多个.o文件,通常用于创建静态可执行文件。

我们使用ar命令来操作归档库。下面的例子中(1)从创建一个存档库。O 文件则(2)列出一个的内容。

创建库

$ ls *.o
a.o  b.o  c.o                 <=== the files going in the archive
$ ar q libmyStuff.a *.o       <=== put *.o files in an archive (or new one)
ar: creating libmyStuff.a    
$ ls *.a                      <=== just show the library created
libmyStuff.a

显示归档库的内容

$ ar t libmyStuff.a
a.o
b.o
c.o

Filetype .lo

的使用。Lo 是一个约定,通常用于与位置无关的目标文件。在当前目录下,libtool compile命令创建两个。Lo 文件和一个。o文件,一个带PIC码,一个不带PIC码。请看下面的输出:

$ libtool compile gcc -c a.c
libtool: compile:  gcc -c a.c  -fPIC -DPIC -o .libs/a.o  <== PIC code
libtool: compile:  gcc -c a.c -o a.o >/dev/null 2>&1     <== Not-PIC code
$ ls a.lo a.o
a.lo  a.o       <=== a.lo contains the PIC code.

还要注意。lib 子目录是用a创建的。O 在其中。这个文件是PIC代码,尽管名称。Libtool将该文件移动到当前目录,并将扩展名更改为.lo

您总是可以手动创建。当您编译时,只需使用PIC选项来gcc,就可以创建lo文件。移动结果。O 文件到。lo 扩展。

文件类型,所以

按照惯例,.so表示一个"共享对象"库文件。我们将PIC对象文件放入共享库中。在的契约中。O 。一个文件,当我们用链接时。因此文件的代码不包含在结果编译文件中。也就是说,我们使用运行时绑定(如中所示)。lo )。运行时绑定的形式不止一种,但我们在这里就不讨论了。

文件是一个库对象,它可以被构建到一个共享库中。文件是一个标准的目标文件

.lo文件是libtool对象,libtool使用它来决定哪些对象文件可以被构建到共享库

.lo文件为库对象,可以构建为共享库,.o文件为标准对象文件。更多信息:如何安装和使用libtool共享库(。lo文件)?