.a .o和.lo文件之间的区别


Answers:


46

“ .lo”文件是一个库对象,可以内置到共享库中,而“ .o”文件是一个标准对象文件

.lo文件是libtool对象,Libtool使用该文件来确定可以将哪些对象文件构建到共享库中


3
这是否意味着.o文件不能内置到共享库中?
拉吉


8
您是否真的希望所有答案都以链接的形式出现?
Fixee

@Raj不,不是这样,命名是方便,而不是必需的。
斯拉瓦

91

.o,.a,.lo和.so之间的区别。

执行摘要

  • .o通常是编译器发出的非PIC目标文件(在链接器阶段之前)。与exe链接时,代码将包含在可执行文件中-我们在链接时绑定。
  • .a通常是一个包含一个或多个.o文件的存档库[non-PIC]。与exe链接时,存档中的特定“ * .o”文件将被插入可执行文件中。
  • .lo通常是一个“库对象”,其中包含PIC代码,无论是使用gcc -fPIC还是使用libtool进行手动编译。
  • .so文件是“共享对象”文件。它们包含PIC对象。

注意:

  • 如果需要静态可执行文件,请使用“ .o”和“ .a”文件。
  • 如果需要/想要动态可执行文件,请在运行时与库绑定,请使用.lo.so文件。

介绍

虽然我喜欢上面的答案,但它们并不涵盖.a / archive库形式。因此,在这里我还将通过添加.so库格式来解决这三个问题。同样,就stackexchange而言,如果链接断开,我将使用更多文本(请注意,我不需要该链接的参考链接)。

文件类型.o

编译.o文件时,是一个目标文件,其中包含编译器发出的目标平台的目标代码。要创建一个.o文件:

gcc -c filename.c     <==== creates filename.o

请注意,此示例未创建位置独立代码(PIC)。我们认为这是一个可能包含在静态库或可执行文件中的对象。也就是说,当我们将可执行文件与.o文件链接时,.o文件中的代码会插入到可执行文件中,它是在构建时绑定的,而不是在运行时绑定的。这意味着可以在不包含.o文件的情况下重新分发可执行文件。注意:约定将.o文件视为非PIC。通常,我们以.lo扩展名命名PIC对象文件。

文件类型.a

.A文件类型是“存档”库。它包含一个或多个.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

文件类型.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.

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

您始终可以通过在编译时使用PIC的gcc选项来手动手动创建.lo文件。将生成的.o文件移动到.lo扩展名。

文件类型.so

按照约定,.so表示“共享对象”库文件。我们将PIC对象文件放入共享库中。与.o.a文件签约时,当我们与.so文件链接时,代码不包含在生成的编译文件中。那就是我们使用运行时绑定(如.lo情况)。有多种形式的运行时绑定,但在此不做介绍。


3
是否有一本书涵盖您在回答中解释的信息类型?我只能在论坛等中找到有用的实用信息,例如您的帖子。这些知识是零碎的,并且永远不会作为程序构建和运行方式的完整介绍。
wandadars's

1
不。* .lo文件是人类可读的纯文本文件,其中包含pic对象和non_pic对象的名称。PIC代码通常位于.libs/a.o和中,nonPIC位于中a.o。因此,libtool创建了3个文件:2个目标文件(.o),1个PIC和1个not +.lo文件,它们描述文件的位置。
卢卡斯Daniluk

1
@wandadars:查看John R. Levine的“链接器和加载器
Heinrich Hartmann,

这是质量更高的答案,应该被接受。
Mayank Sharma,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.