.a
.o
和.lo
file in C有什么区别?
Answers:
“ .lo”文件是一个库对象,可以内置到共享库中,而“ .o”文件是一个标准对象文件
.lo文件是libtool对象,Libtool使用该文件来确定可以将哪些对象文件构建到共享库中
注意:
虽然我喜欢上面的答案,但它们并不涵盖.a / archive库形式。因此,在这里我还将通过添加.so库格式来解决这三个问题。同样,就stackexchange而言,如果链接断开,我将使用更多文本(请注意,我不需要该链接的参考链接)。
编译.o文件时,是一个目标文件,其中包含编译器发出的目标平台的目标代码。要创建一个.o文件:
gcc -c filename.c <==== creates filename.o
请注意,此示例未创建位置独立代码(PIC)。我们认为这是一个可能包含在静态库或可执行文件中的对象。也就是说,当我们将可执行文件与.o文件链接时,.o文件中的代码会插入到可执行文件中,它是在构建时绑定的,而不是在运行时绑定的。这意味着可以在不包含.o文件的情况下重新分发可执行文件。注意:约定将.o文件视为非PIC。通常,我们以.lo扩展名命名PIC对象文件。
该.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的使用是一种约定,通常用于与位置无关的目标文件。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表示“共享对象”库文件。我们将PIC对象文件放入共享库中。与.o和.a文件签约时,当我们与.so文件链接时,代码不包含在生成的编译文件中。那就是我们使用运行时绑定(如.lo情况)。有多种形式的运行时绑定,但在此不做介绍。
.libs/a.o
和中,nonPIC位于中a.o
。因此,libtool创建了3个文件:2个目标文件(.o
),1个PIC和1个not +.lo
文件,它们描述文件的位置。
该.lo
文件是一个库对象,可以将其内置到共享库中,并且该.o
文件是标准对象文件。更多信息:如何安装和使用libtool共享库(.lo文件)?