obj,lib,dll,exe的关系

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.理论上可以连接obj文件来引用其他工程(可以认为一个obj文件等价于编译生成它的cpp文件,可以引用obj来替换cpp,也可以添加cpp来替换obj ),但实际中通常用lib来实现工程间相互引用。
    3.编译器会默认链接一些常用的库,其它的需要你自己指定。
   
lib和DLL的区别

(1)lib是编译时需要的,dll是运行时需要的。如果要完成源代码的编译,有lib就够了。如果也使动态连接的程序运行起来,有dll就够了 。在开发和调试阶段,当然最好都有。
    (2) 一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。 静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
    (3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件(实际上也算是一个静态库,只是在链接时只能把函数在DLL的入口链接到exe中,而不像真正静态链接库那样将函数体真正链接到exe中 ,通过lib进行的动态链接实际上也使用了静态链接来实现 ),一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。

DLL内的函数分为两种:
    (1)DLL导出函数,可供应用程序调用;
    (2)DLL内部函数,只能在DLL程序使用,应用程序无法调用它们

创建静态链接库和创建动态链接库

VC6中创建[Win32 Dynamic-Link Library]工程便可以创建出一个空的DLL工程.

VC6中创建[Win32 Static Library]工程便可以创建出一个空的LIB工程(静态链接库工程,仅生成一个lib文件).

添加lib文件的常用办法有二个:
    1、把*.lib放在VC的Lib目录中
    2、修改project setting的Link->Input中的Addtional library path,加入你的目录dll:是可实际运行的二进制代码,有定位代码的!

3、也可以在object/library中直接写上lib文件路径.(这里实际上是可以写上任意obj文件或者lib文件的).

有个个人的方法:当有时间提示缺少某个标示符什么的时候,通过文件搜索工具(TC可以直接搜索二进制文件的)搜索这个标识符(一般函数名),找到它被放到哪里了,然后引用就好了,:-)

obj,lib,dll,exe相关推荐

  1. c++编译 (.obj, .lib, .dll, .exe的关系(附:lib和DLL的区别))

    转载原网址 c++程序在编译后,在目标路径下会生成多个文件: Debug文件夹(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb ...

  2. VS2015 编译输出的*.lib,*.dll,*.exe的区别

    VS2015编译完C++程序后,一般会在Release或者Debug文件路径下生成多个文件: 例如:输出文件夹下会出现这些文件:*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb, ...

  3. C++中sln,vcxproj,vcxproj.filters,lib,dll,exe含义

    建立工程 建立C++工程后会生成多个文件,例如sln,sdf,vcxproj,vcxproj.filters,vcxproj.user这些都是文件的扩展名. sln是解决方案文件,为解决方案资源管理器 ...

  4. “.dll .obj .lib”和“ .so .o .a”文件与动态链接和静态链接

    ".dll .obj .lib"和" .so .o .a"文件 (1) .dll .obj .lib使用在windows平台下. .dll:动态链接库,作为共享 ...

  5. 关于.h .lib .dll的总结

    对VC工程中的调用过程有些迷糊,所以就理清一下: 1.#include "...h"为头文件预编译命令,如果这些代码被修改,则需要重新编译生成预编译头文件. 预编译头的概念(转载) ...

  6. MTD/MT/MDD/MD以及LIB/DLL之间的一些联系和问题

    这个话题要从哪里说起呢.博主小白一个,最近调试程序时(WIN-MSVC)连一些基本问题都没弄懂,本着遇见问题一定要解决的原则,下面来说下MTD/MT/MDD/MD以及LIB/DLL之间的一些联系和问题 ...

  7. mysql.lib 是mtd mdd_MTD/MT/MDD/MD以及LIB/DLL之间的一些联系和问题

    这个话题要从哪里说起呢.博主小白一个,最近调试程序时(WIN-MSVC)连一些基本问题都没弄懂,本着遇见问题一定要解决的原则,下面来说下MTD/MT/MDD/MD以及LIB/DLL之间的一些联系和问题 ...

  8. c#:Reflector+Reflexil 修改编译后的dll/exe文件

    原文:c#:Reflector+Reflexil 修改编译后的dll/exe文件 不知道大家有没有这样的经历:现场实施时测试出一个bug,明明知道某个dll/exe文件只要修改一二行代码即可,但手头没 ...

  9. [Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE

    在有些情况下需要得到函数调用者的模块名字.比如你想限制你的某个函数只能被自己某个特定的DLL调用. 或者比如在异常处理中你想了解是那个DLL/EXE抛出了异常. API函数_ReturnAddress ...

最新文章

  1. Spring MVC 解读——@Autowired
  2. java.io.IOException: Stream closed
  3. JDK1.8源码分析之HashMap(一) (转)
  4. android SQLite数据库用法图文详解(附源码)
  5. Unfair contest 模拟-分类讨论
  6. 易创课堂武汉站-NTES@百位创业者智慧众筹
  7. 800万行代码的鸿蒙系统,在世界上处于什么水平?
  8. IP 地址 与硬件地址
  9. 数字 IC 笔试面试必考点(8)时钟偏差以及时钟抖动
  10. Intel 5 6 7 8系列芯片组介绍
  11. 集装箱编号校验码规则及java程序的实现
  12. Qt 免注册版本下载
  13. Recurrent Neural Network(循环神经网络)
  14. 通俗的讲,网络爬虫到底是什么?
  15. abp框架mysql连接配置_ABP框架使用Mysql数据库
  16. win10任务栏网络连接图标消失的解决办法
  17. 单模光电转换器怎么接_光纤收发器怎么连接?光纤收发器连接图解!
  18. 嵌入式中SIM卡接口电路设计
  19. python runtimewarning_训练神经网络,numpy出现runtime warning的解决思路
  20. iOS app已经上架可供销售,但是在AppStore上搜不到的解决办法

热门文章

  1. acer清理工具 clear下载_放下偏见,这些国内大厂出品的工具资源,免费又良心!...
  2. matlab神经模糊推理系统
  3. Visual Studio Code设置中文包/配置中文语言
  4. 回文串判定_JAVA
  5. Pytorch搭建SSD目标检测平台
  6. Spring MVC 原理探秘 - 容器的创建过程
  7. Java模块化之路 —— OSGI介绍
  8. TCP/UDP,SOCKET,HTTP,FTP协议简析
  9. 正确认识Arrays.asList方法
  10. 怎样使用Mendeley高效地管理中文文献