.o和.lo文件的区别
Difference between .a .o and .lo file
C中的.a
、.o
和.lo
文件有什么区别?
.o, .a, .lo和.so的区别
摘要- 。o通常是由编译器发出的非pic对象文件(在链接阶段之前)当与exe链接时,代码将包含在可执行文件中——我们在链接时绑定。
- 。通常是包含一个或多个的存档库。o文件[非pic]。当与exe链接时,特定的"*。"文件中的文件将被插入可执行文件。
- 。lo通常是包含PIC代码的"库对象",无论是使用gcc -fPIC手工编译还是使用libtool。
- 。所以文件是"共享对象"文件。它们包含PIC对象。
注意:
- 如果你需要静态可执行文件,那么使用"。"answers"。一个"文件。
- 如果您需要/希望动态可执行文件在运行时与库绑定,请使用。Lo 和。所以文件。
虽然我喜欢上面的答案,但它们不包括.a/archive library表单。因此,我将在这里讨论这三个问题,并添加一个额外的。So库格式。此外,在stackexchange的脉络中,我将使用更多的文本,以防链接断开(注意,我不需要参考链接)。
Filetype . o
编译时的。O
文件是一个目标文件,其中包含编译器为目标平台发出的目标代码。创建。o 文件:gcc -c filename.c <==== creates filename.o
注意,这个例子没有创建位置无关代码(PIC)。我们认为这个对象可能包含在静态库或可执行文件中。也就是说,当我们用链接可执行文件时。O 文件,. O文件中的代码被插入到可执行文件中——它是在构建时绑定的,而不是在运行时绑定的。这意味着可以在不包含.o文件的情况下重新分发可执行文件。注意:是惯例。o文件被认为是非pic文件。我们通常用来命名PIC对象文件。lo 扩展。
文件类型。
。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
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.
还要注意。lib 子目录是用a创建的。O 在其中。这个文件是PIC代码,尽管名称。Libtool将该文件移动到当前目录,并将扩展名更改为.lo。
您总是可以手动创建。当您编译时,只需使用PIC选项来gcc,就可以创建lo文件。移动结果。O 文件到。lo 扩展。
文件类型,所以
按照惯例,.so表示一个"共享对象"库文件。我们将PIC对象文件放入共享库中。在的契约中。O 和。一个文件,当我们用链接时。因此文件的代码不包含在结果编译文件中。也就是说,我们使用运行时绑定(如中所示)。lo )。运行时绑定的形式不止一种,但我们在这里就不讨论了。
文件是一个库对象,它可以被构建到一个共享库中。文件是一个标准的目标文件
.lo文件是libtool对象,libtool使用它来决定哪些对象文件可以被构建到共享库
.lo
文件为库对象,可以构建为共享库,.o
文件为标准对象文件。更多信息:如何安装和使用libtool共享库(。lo文件)?
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- C++:包含指令和头文件有什么区别?
- 为什么 .cpp 文件和 .h 文件之间有区别?
- 包含 .h 文件和 c/cpp 文件有什么区别?
- ios::app 和 ios::noreplace 模式在文件处理中有什么区别?
- 在 c++ 中将结构的每个成员写入文件和将结构对象直接写入文件之间有什么区别吗?
- Open() 用于创建文件和打开现有文件.有人能分辨出其中的区别
- pimpl和定义类别的.cpp文件之间的区别
- 使用运算符读取文件和使用读取功能>>文件有什么区别?
- openssl rc4 命令行加密和 cpp 文件实现 rc4 之间的区别
- 在Android NDK库.a文件中,gnustl_shared和gnustl_static有什么区别
- 将静态库链接行添加到我的QT项目文件没有区别
- 我的编译行和我的生成文件之间的区别可能导致错误
- CBP文件和CPP文件之间有什么区别
- 将头文件(.h)放在另一个文件(.h或.cpp)的开头和结尾之间的区别
- .o、.a和.so文件之间有什么区别
- 挂载文件系统和挂载磁盘驱动器有什么区别
- 以二进制和文本打开文件之间的区别
- 链接到动态文件和作为输入对象有什么区别?