c++编译 (.obj, .lib, .dll, .exe的关系(附:lib和DLL的区别))
转载原网址
c++程序在编译后,在目标路径下会生成多个文件:
Debug文件夹(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb,*.plg
*.exe:是生成的可执行文件
*.ilk:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信息
*.obj:是目标文件,源程序编译后的产物
*.pch:全称是PreCompiled Header,就是预先编译好的头文件
*.idb:文件保存的信息,使编译器在重新编译的时候只重编译最新改动过的函数和只对最新类定义改动过的源文件进行重编译,以提高编译速度
*.pdb:全称是Program DataBase,即程序数据库文件,用来记录调试信息
*.dsp:(全称是Developer Studio Project)也是一个配置文件
*.ncb:(全称No Compile Browser)的缩写,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC开发环境自动生成
*.plg:实际上是一个超文本文件,可以用Internet Explorer打开,记录了Build的过程
*.cpp:就是C++源代码文件.
具体介绍:
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的链接失败。
1.obj里存的是编译后的代码跟数据,并且有名称,所以在连接时会出现未解决的外部符号一说。当连成exe后便不存在名称的概念了,只有地址。lib就是一堆obj的组合。
2.理论上可以,但实际中通常用lib。
3.编译器会默认链接一些常用的库,其它的需要你自己指定。
附上lib和DLL的区别
(1)lib是编译时需要的,dll是运行时需要的。
如果要完成源代码的编译,有lib就够了。
如果也使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。
(2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。
c++编译 (.obj, .lib, .dll, .exe的关系(附:lib和DLL的区别))相关推荐
- 深入理解编译注解(三)依赖关系 apt/annotationProcessor与Provided的区别
前言 网上有很多朋友在问: apt/annotationProcessor与Provided 都是只编译并不打入apk中,他俩到底有什么区别呢?所以我就把自己所了解的与大家分享一下. 正文 编译关系 ...
- obj,lib,dll,exe
obj,lib,dll,exe的关系 lib是和dll对应的.lib是静态链接库的库文件,dll是动态链接库的库文件. 所谓静态就是link的时候把里面需要的东西抽取出来安排到你的exe文件中 ...
- VS2015 编译输出的*.lib,*.dll,*.exe的区别
VS2015编译完C++程序后,一般会在Release或者Debug文件路径下生成多个文件: 例如:输出文件夹下会出现这些文件:*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb, ...
- .h头文件 .lib库文件 .dll动态链接库文件关系
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够 ...
- C++中sln,vcxproj,vcxproj.filters,lib,dll,exe含义
建立工程 建立C++工程后会生成多个文件,例如sln,sdf,vcxproj,vcxproj.filters,vcxproj.user这些都是文件的扩展名. sln是解决方案文件,为解决方案资源管理器 ...
- MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用
静态链接库LIB和动态链接库DLL的区别,创建和示例 1.什么是静态连接库,什么是动态链接库 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都 ...
- lib库反编译C语言,C语言静态链接库(lib)与动态链接库(dll)
今天看到了之前的笔记,看到之前写的笔记,感觉自己都不认得了~~一.静态链接库(lib) 首先创建 "在VC6中创建项目:Win32 Static Library" 在项目中创 ...
- c#:Reflector+Reflexil 修改编译后的dll/exe文件
原文:c#:Reflector+Reflexil 修改编译后的dll/exe文件 不知道大家有没有这样的经历:现场实施时测试出一个bug,明明知道某个dll/exe文件只要修改一二行代码即可,但手头没 ...
- 编译+构建+链接+运行之间的关系分析
编译+构建+链接+运行之间的关系分析 源文件+编译+部署+测试+打包 Maven+default: 验证(validate)+编译(compile)+测试(test)+打包(package)+验证(v ...
最新文章
- 关于HTML头文件中的meta
- 图像滤镜艺术---微软自拍APP滤镜实现合集DEMO
- LaTeX 基础笔记。开篇
- window.open打开新窗口被浏览器拦截的处理方法
- [USACO14OPEN]Fair Photography【前缀和】
- Mugeda(木疙瘩)H5案例课—重力感应类H5-岑远科-专题视频课程
- 无法打开FTP在 windows资源管理器中打开FTP站点解决方法
- 极进网络(Extreme Networks )Extreme VDX 6940 交换机光模块配置方案
- 软件测试:什么样的公司需要专职测试?
- ZIP压缩算法详细分析及解压实例解释
- truncate函数
- JS 日期转换成时间戳
- 如何用python自动改试卷_2019Python100道面试题,你会几道?
- 我的世界显示服务器领地指令,我的世界领地指令介绍 我的世界领地指令怎么设置...
- 数字签名(RSA签名、ElGamal签名、Schnorr签名、DSS、DSA、离散对数签名、特殊性质的签名算法、Chaum盲签名、Chaum-Antwerpen不可否认签名、群签名、MUO代理签名)
- 计算机视觉、机器学习、图形学等学习资料网站
- openGL library下载地址
- mybatis mapper 一对多分页查询
- 汽车java歌曲_车载音乐推荐 50首适合开车听的歌曲 2019车载歌曲 开车必备100首...
- BUUCTF-[BJDCTF2020]EzPHP
热门文章
- 王权富贵软件:安装Python的方法
- 计算机毕业设计Java计算机类专业考研交流学习平台(源码+系统+mysql数据库+lw文档)
- 51.com“彩虹”上线 矛头直指腾讯(每日关注:2009.12.24)
- Linux GRUB启动分析之stage1
- 压缩包Zip格式详析(全网最详细)
- vue (前端将文件下载为.zip格式)
- java timespan 格式化_C# 计算时间差 用timespan函数
- 测试计算机网络的连通性,计算机网络系统连通性测试
- 三名学霸与计算机的缘,2020清华特奖入围名单公布:电子系学霸两篇顶会一作,2名计算机女生入选...
- 注册安全工程师成绩查询时间2023,注安成绩保留多久?