【发布时间】:2011-08-19 05:36:58
【问题描述】:
C语言中.a.o和.lo文件有什么区别?
【问题讨论】:
标签: c++ c shared-libraries libraries
C语言中.a.o和.lo文件有什么区别?
【问题讨论】:
标签: c++ c shared-libraries libraries
注意:
虽然我喜欢上面的答案,但它们不包括 .a/archive 库表单。因此,在这里我将通过添加 .so 库格式来解决所有这三个问题。此外,在 stackexchange 的脉络中,我将使用更多文本以防链接损坏(请注意,我不需要此链接的参考链接)。
当编译一个 .o 文件是一个包含编译器为目标平台发出的目标代码的目标文件。创建 .o 文件:
gcc -c filename.c <==== creates filename.o
请注意,此示例未创建位置无关代码 (PIC)。我们认为这是一个可能包含在静态库或可执行文件中的对象。也就是说,当我们将可执行文件与 .o 文件链接时,.o 文件中的代码会插入到可执行文件中——它是在构建时绑定的,而不是在运行时绑定的。这意味着可执行文件可以在不包含 .o 文件的情况下重新分发。警告:按照惯例,.o 文件被视为非 PIC。我们通常使用 .lo 扩展名来命名 PIC 对象文件。
.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
.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。
您可以随时手动创建 .lo 文件,只需在编译时使用 gcc 的 PIC 选项即可。将生成的 .o 文件移动到 .lo 扩展名。
按照惯例,.so 意味着一个“共享对象”库文件。我们将 PIC 对象文件放入共享库中。在与 .o 和 .a 文件的合同中,当我们与 .so 文件链接时,代码不会包含在生成的编译文件中。那就是我们使用运行时绑定(如 .lo 的情况)。运行时绑定的形式不止一种,但我们不会在这里讨论。
【讨论】:
.libs/a.o 中,而非PIC 代码在a.o 中。所以 libtool 创建了 3 个文件:2 个目标文件 (.o),一个 PIC 和一个非 + .lo 描述文件位置的文件。
The '.lo' file is a library object,可以内置到共享库中,'.o'文件是标准目标文件
The .lo file is the libtool object,Libtool 使用它来确定可以将哪些目标文件构建到共享库中
【讨论】:
.lo文件是库对象,可以内置到共享库中,.o文件是标准对象文件。更多信息:How to install and use libtool shared library (.lo files)?
【讨论】: