C中的.a
.o
和.lo
文件之间有什么区别?
答案 0 :(得分:68)
注意:强>
虽然我喜欢上面的答案,但它们不包括.a / archive库表单。所以在这里我将解决所有这三个问题,并加入.so库格式。另外,在stackexchange的静脉中,我将使用更多文本以防链接被破坏(注意我不需要这个链接的参考链接。)
编译 .o 文件时,是一个目标文件,其中包含目标平台的编译器发出的目标代码。要创建 .o 文件:
gcc -c filename.c <==== creates filename.o
请注意,此示例未创建位置无关代码(PIC)。我们认为这是一个可能包含在静态库或可执行文件中的对象。也就是说,当我们将可执行文件与 .o 文件链接时,.o文件中的代码将插入到可执行文件中 - 它在构建时绑定,而不是在运行时绑定。这意味着可以重新分发可执行文件而不包含.o文件。警告: .o 文件被认为是非PIC的惯例。我们通常使用 .lo 扩展名命名PIC对象文件。
.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
使用 .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 扩展名。
按惯例.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)?