关注分享主机优惠活动
国内外VPS云服务器

linux obj代表什么?

本文主要讲解“linux obj代表什么”,感兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。下面就让主机频道带你学习一下“linux obj代表什么”!

Linux obj代表”。o”在linux中,也就是目标文件,相当于”。obj”文件;编译后的代码和数据存储在obj中,它们有名字,所以连接时有时会出现外部符号未解决的问题。

的分析。一个,。所以还有。Linux中的o文件

linux obj表示什么

当我们在Linux平台上安装源代码时,经常会遇到。所以还有。o文件。一般来说,我们只需要查看这些文件的输出信息,不需要深入探究。但是如果需要我们自己写源代码,手动编译,就需要对这些信息有很深的理解。

文件解释

其实这些。所以,。o,。linux中的a文件对应Windows中的obj、lib、dll、exe等文件。在解释linux中的这些文件之前,先说一下windows中这些文件的作用。

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

Exe是我们通常知道的可执行程序的后缀,而obj、lib、dll是运行程序的关键文件。Lib对应dll。Lib是静态链接库的库文件,dll是动态链接库的库文件。

所谓静态,就是你链接的时候,把你需要的东西提取出来,整理在你的exe文件里,这样以后运行你的exe就不需要lib了。所谓动态就是exe运行时,依赖于dll中提供的函数。如果没有这个dll,您的exe将无法运行。

Lib、DLL和EXE都是最终的目标文件和最终产品。而c/c++属于源代码。中间代码obj是源代码和最终目标文件之间的过渡。其实你之所以需要中间代码,是因为你无法一次性获取目标文件。

例如,一个exe需要生成很多cpp文件。编译器一次只能编译一个cpp文件。这样,编译一个cpp后,编译器会把它编译成obj。当所有必要的CPP编译成obj后,就会链接成所需的exe。应该说缺少任何一个obj都会导致链接exe失败。

编译后的代码和数据存储在obj中,它们有名字,所以连接时有时会出现外部符号未解决的问题。作为exe连接时,没有名字的概念,只有地址。Lib是对象的组合。

理论上是可以链接obj文件来引用其他项目的(一个obj文件可以看作相当于编译生成了它的cpp文件,可以引用它来替换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程序中使用,应用程序不能调用它们。

之间的差异。o,。一个和。所以linux下的文件

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

。共享库也是,共享对象,用于动态连接,相当于windows下的一个dll,Linux下的一个可执行文件。

。是一个静态库。说白了就是一堆。o组合为静态连接,效果与相同。o.

静态函数库

特点:其实就是一个简单的常用目标文件的集合,在程序执行前添加到目标程序中。

优点:可以兼容之前的一些程序;简单描述;允许程序员不用重新编译代码就可以链接程序,也就是说不需要外部函数的支持,节省了重新编译代码的时间(这个优势目前还不明显);开发者也可以对源代码保密。

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

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

共享函数库

可执行程序启动时加载共享函数库,所有程序重新运行时可自动加载共享函数库中的函数。与静态函数库相比,共享函数库在编译时并不编译成目标代码。

程序执行相关函数时,会调用共享函数库中的相应函数,所以共享函数库生成的可执行文件比较小。因为共享函数库并没有集成到你的程序中,而是在程序运行时动态应用和调用的,所以程序的运行环境中必须提供相应的库。

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

未经允许不得转载:主机频道 » linux obj代表什么?

评论 抢沙发

评论前必须登录!