为了账号安全,请及时绑定邮箱和手机立即绑定

c++中的dll问题

c++中的dll问题

C++
练习册 2016-06-17 16:53:21
有没有好的书籍介绍c++中的一些编译链接还有dll库等的问题?
查看完整描述

2 回答

已采纳
?
tanhouyusheng

TA贡献94条经验 获得超59个赞

VC++动态链接库(DLL)编程

查看完整回答
反对 回复 2016-06-17
?
SapereAudor

TA贡献22条经验 获得超11个赞

这个问题不是一两句话可以解释完

1、微软提供给我们的MFC已经编译成静态LIB和动态LIB,同时,为方便调试,微软将MFC源码(CPP文件)也放到VC里一起发布了;这里会存在两种情况,如果是静态LIB,那么功能代码会在链接时链接进你的EXE文件中,所以这种静态LIB方式时,EXE文件通常都比较大;如果是动态LIB的方式,那么运行的时候就需要mfcxxx.dll文件,但EXE文件体积比较小

2、如果你理解了1,我再进一步解释,MFC工程配置的时候默认会链接mfcxxx.lib的,所以你的工程里只需要包含对应的头文件,例如 afxxxx.h之类的文件即可,编译器在编译阶段是不需要知道具体实现代码在哪里的,它只需要知道声明即可编译通过,同时编译器会将那些外部的函数(即不是在当前CPP文件实现的函数)标记为需要修复的(我们先把它叫做修复吧);那么,假如我用了一个MFC的函数,现在我只有声明,它是怎么找到具体的实现代码呢,这就是链接器的工作了,刚才我说过,MFC工程默认是会链接mfcxxx.lib的,所以链接器在工作的时候,它会遍历所有编译过的文件,从里面找出要修复的项,然后再遍历LIB文件,如果在LIB文件里找到对应的实现,那么链接器会把编译阶段留下的手尾FIX掉

3、如果你理解了2,我们再进一步解释2;链接器链接LIB的时候,会有两种情况,第一种,这个LIB本身是一个静态LIB,包含了具体的实现;第二种,这个LIB本身只是一个中介,它是指向DLL的某个函数的;对于第一种情况,链接器会把用到的所有代码链接进去,注意,在Release版本情况下,链接器只会把用的的函数链进去,就是说,即使你的静态LIB有10MB,你也不需要担心编译出来的EXE有10MB,它只会把用到的函数链进去;;对于第二种,是指向DLL某个函数的,链接器会在EXE的PE部里的导入表部分,增加一个项,这个项指向DLL的函数,同时在修复编译阶段留下手尾的地方,让它JMP(跳转)或CALL(调用)到我们DLL函数里

以上纯属个人解释,因为在编译链接阶段是非常复杂的,一时间没办法完全解决齐,有问题可以继续追问

查看完整回答
反对 回复 2016-06-23
  • 2 回答
  • 3 关注
  • 1394 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信