c++中的dll问题

有没有好的书籍介绍c++中的一些编译链接还有dll库等的问题?

练习册
浏览 1437回答 2
2回答

tanhouyusheng

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

SapereAudor

这个问题不是一两句话可以解释完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函数里以上纯属个人解释,因为在编译链接阶段是非常复杂的,一时间没办法完全解决齐,有问题可以继续追问
打开App,查看更多内容
随时随地看视频慕课网APP