linux obj表示什么

87次阅读
没有评论

共计 2447 个字符,预计需要花费 7 分钟才能阅读完成。

本篇内容主要讲解“linux obj 表示什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“linux obj 表示什么”吧!

linux obj 代表 linux 中的“.o”,即目标文件,也就是相当于 windows 中的“.obj”文件;obj 里存的是编译后的代码跟数据,并且有名称,所以在连接时有时会出现未解决的外部符号的问题。

浅析 Linux 中的.a、.so、和.o 文件

前言

我们在 Linux 平台进行源码安装的时候,经常会遇到.so、.o 文件的输出信息。这些文件的输出信息我们一般来说只需要大概看一眼,不需要深入探索。但是如果我们需要亲自编写源码,手动进行编译的时候,就需要对这些信息进行深度了解了。

文件解释

在 linux 中这些.so、.o、.a 文件,其实和 Windows 中的 obj、lib、dll、exe 等文件的关系是对应的。在解释 linux 这些文件之前,我们先来说下 windows 中这些文件的作用。

windows 下 obj、lib、dll、exe 的关系

exe 是我们平常所知道的可执行程序的后缀,而 obj、lib、dll 则是构成运行程序的关键文件。lib 是和 dll 对应的。lib 是静态链接库的库文件,dll 是动态链接库的库文件。

所谓静态就是 link 的时候把里面需要的东西抽取出来安排到你的 exe 文件中,以后运行你的 exe 的时候不再需要 lib。所谓动态就是 exe 运行的时候依赖于 dll 里面提供的功能,没有这个 dll,你的 exe 无法运行。

lib,dll,exe 都算是最终的目标文件,是最终产物。而 c /c++ 属于源代码。源代码和最终目标文件中过渡的就是中间代码 obj,实际上之所以需要中间代码,是你不可能一次得到目标文件。

比如说一个 exe 需要很多的 cpp 文件生成。而编译器一次只能编译一个 cpp 文件。这样编译器编译好一个 cpp 以后会将其编译成 obj,当所有必须要的 cpp 都编译成 obj 以后,再统一 link 成所需要的 exe,应该说缺少任意一个 obj 都会导致 exe 的链接失败。

obj 里存的是编译后的代码跟数据,并且有名称,所以在连接时有时会出现未解决的外部符号的问题。当连成 exe 后便不存在名称的概念了,只有地址。lib 就是一堆 obj 的组合。

理论上可以连接 obj 文件来引用其他工程(可以认为一个 obj 文件等价于编译生成它的 cpp 文件, 可以引用 obj 来替换 cpp, 也可以添加 cpp 来替换 obj),但实际中通常用 lib 来实现工程间相互引用。

编译器会默认链接一些常用的库,其它的需要你自己指定。

lib 和 dll 的区别

lib 是编译时需要的,dll 是运行时需要的。如果要完成源代码的编译,有 lib 就够了。如果也使动态连接的程序运行起来,有 dll 就够了。在开发和调试阶段,当然最好都有。

一般的动态库程序有 lib 文件和 dll 文件。lib 文件是必须在编译期就连接到应用程序中的,而 dll 文件是运行期才会被调用的。如果有 dll 文件,那么对应的 lib 文件一般是一些索引信息,具体的实现在 dll 文件中。如果只有 lib 文件,那么这个 lib 文件是静态编译出来的,索引和实现都在其中。

静态编译的 lib 文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。

在动态库的情况下,有两个文件,一个是引入库 (.LIB) 文件(实际上也算是一个静态库, 只是在链接时只能把函数在 dll 的入口链接到 exe 中, 而不像真正静态链接库那样将函数体真正链接到 exe 中 , 通过 lib 进行的动态链接实际上也使用了静态链接来实现),一个是 dll 文件,引入库文件包含被 dll 导出的函数的名称和位置,dll 包含实际的函数和数据,应用程序使用 LIB 文件链接到所需要使用的 dll 文件,库中的函数和数据并不复制到可执行文件中.

因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是 dll 中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,dll 和.LIB 文件必须随应用程序一起发行,否则应用程序将会产生错误。

dll 内的函数分为两种:

dll 导出函数,可供应用程序调用;

dll 内部函数,只能在 dll 程序使用,应用程序无法调用它们

linux 下 .o、.a、.so 文件的的区别

.o, 是目标文件, 相当于 windows 中的.obj 文件。

.so 为共享库, 是 shared object, 用于动态连接的, 相当于 windows 下的 dll,是 Linux 中的可执行文件。

.a 为静态库, 说白了就是一堆.o 合在一起, 用于静态连接,效果和.o 是一样的。

静态函数库

特点:实际上是简单的普通目标文件的集合,在程序执行前就加入到目标程序中。

优点:可以用以前某些程序兼容;描述简单;允许程序员把程序 link 起来而不用重新编译代码,也就数不需要外部函数的支持,节省了重新编译代码的时间(该优势目前已不明显);开发者还可以对源代码保密。

这类库的名字一般是 libxxx.a. 利用静态函数库编译成的文件比较大, 因为整个函数库的所有数据都会被整合进目标代码中。

缺点:如果静态函数库改变了, 那么你的程序必须重新编译。

共享函数库

共享函数库在可执行程序启动的时候加载,所有程序重新运行时都可自动加载共享函数库中的函数。相对于静态函数库, 共享函数库在编译的时候 并没有被编译进目标代码中。

当程序执行到相关函数时才调用共享函数库里相应的函数, 因此共享函数库所产生的可执行文件比较小. 由于共享函数库没有被整合进你的程序, 而是在程序运行时动态地申请并调用, 所以程序的运行环境中必须提供相应的库.

共享函数库的改变并不影响你的程序, 所以共享函数库的升级比较方便.

到此,相信大家对“linux obj 表示什么”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-12发表,共计2447字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)