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

时间:2011-05-05 09:45:36

标签: c++ c shared-libraries libraries

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

3 个答案:

答案 0 :(得分:68)

.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的静脉中,我将使用更多文本以防链接被破坏(注意我不需要这个链接的参考链接。)

Filetype .o

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

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

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

Filetype .a

.a 文件类型是&#34; 存档&#34;图书馆。它包含一个或多个.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.

另请注意, .libs 子目录是使用 a.o 创建的。这个文件是PIC代码,尽管名称。 Libtool 将此文件移至当前目录,并将扩展名更改为 .lo

您只需在编译时使用PIC选项gcc即可手动创建 .lo 文件。将生成的 .o 文件移至 .lo 扩展名。

Filetype .so

按惯例.so意味着&#34;共享对象&#34;库文件。我们将PIC对象文件放入共享库中。在与 .o .a 文件的合同中,当我们与 .so 文件链接时,代码不会包含在生成的编译文件中。那就是我们使用运行时绑定(如 .lo 情况)。有不止一种形式的运行时绑定,但我们不会在这里进入。

答案 1 :(得分:32)

The '.lo' file is a library object,可以内置到共享库中,'。o'文件是标准目标文件

The .lo file is the libtool object,Libtool用它来确定哪些对象文件可以构建到共享库中

答案 2 :(得分:4)

.lo文件是一个库对象,可以构建到共享库中,.o文件是标准目标文件。更多信息:How to install and use libtool shared library (.lo files)?