请教关于h、lib、dll三者之间的关系

yajyjy 2009-01-09 02:21:28
通常封装一个库之后,很多模块会使用到这个库。假设其它模块静态调用使用这个库,我的理解是:
1.如果只是修改了这个库文件中的cpp文件,在更新这个库给其它模块使用时,不需要更新.h和.lib重新进行编译链接,只需要更新dll给其它模块运行时使用;
2.如果在.h和.cpp文件中增加了外部接口函数,在更新dll时,要同步更新.h和.lib重新进行编译链接;

对以下情况不是很清楚:
1.如果在这个库的.h文件中增加了成员变量,而没有修改到外部模块调用接口的情况下,在更新dll时,是否需要外部模块更新lib文件重新编译链接?
2.如果修改了.h和.cpp文件中外部接口函数的参数名称,而整个接口函数的参数类型不变,在更新dll时,是否需要外部模块更新h和lib文件重新编译链接?
3.如果在.h和.cpp文件中增加了内部函数,而给外部模块使用的接口函数不变,在更新dll时,是否需要外部模块更新h和lib文件重新编译链接?
4.如果在.h和.cpp文件中增加了外部接口函数,而这些新增加的接口函数在某个模块没有被调用。在这种情况下,这个未调用新增加外部接口的模块是否需要更新h和lib文件重新编译链接?

以上提到的接口,仅代表h文件中的供外部调用的公有成员函数。假设这个库的.h文件直接继承一个纯虚的接口类,只要不涉及到这个纯虚接口类的改动,应该都不需要重新编译链接,对吧?


请有经验的人给予比较准确的回答,谢谢!
...全文
673 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwxxb40000 2009-01-23
  • 打赏
  • 举报
回复

学习
daokedaofei 2009-01-22
  • 打赏
  • 举报
回复
我也遇到了搂主的问题,帮忙顶一下。
Dan_M 2009-01-12
  • 打赏
  • 举报
回复
不同情况都试验一下吧
bitwwzhang130 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cnzdgs 的回复:]
h与定义有关;lib与接口有关。
如果所有有关定义都在h中,只要h没变,只更新dll就可以。
只要接口没变就不需要更新lib。
[/Quote]
同意此观点
  • 打赏
  • 举报
回复
真理来源于实践
ygayct 2009-01-12
  • 打赏
  • 举报
回复
多实践就理解了,其实用不着问别人。
littlefangMFC 2009-01-12
  • 打赏
  • 举报
回复
隐式加载需要.lib和.h,显示加载只需要DLL就可以了,我理解的没问题吧?
cnzdgs 2009-01-09
  • 打赏
  • 举报
回复
h与定义有关;lib与接口有关。
如果所有有关定义都在h中,只要h没变,只更新dll就可以。
只要接口没变就不需要更新lib。
fhinalibob 2009-01-09
  • 打赏
  • 举报
回复
问得很详细,帮顶
DarknessTM 2009-01-09
  • 打赏
  • 举报
回复
h文件就是函数原型定义,用于给编译器确定参数的压栈方式
lib文件就是函数的相对地址定义(也有直接就是实现内容的,比如静态库)
dll是实际二进制代码
路人乙2019 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yang79tao 的回复:]
只要dll变了,就要更新lib,并重新连接。h文件由于只是一个签名,所以只在接口改动时更新。
如果只要接口不变,就可只更新dll而不用重新连接的话,dll不成了com了,就是因为有dll hell,才有COM出现的。
[/Quote]。
youngwolf 2009-01-09
  • 打赏
  • 举报
回复
只要dll变了,就要更新lib,并重新连接。h文件由于只是一个签名,所以只在接口改动时更新。
如果只要接口不变,就可只更新dll而不用重新连接的话,dll不成了com了,就是因为有dll hell,才有COM出现的。
fandh 2009-01-09
  • 打赏
  • 举报
回复
看样子,只要改动了,还是老老实实编译一下的好!
oyljerry 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yajyjy 的回复:]
有些情况下,即使不重新编译,这个dll在其它模块也是能运行的,但是不能保证这个dll能稳定运行,这也加大了写代码验证的难度。
同时写代码验证固然重要,但是如果从纯理论的角度能确认这些问题更好,对吧?
在一个大型的工程项目中,经常会涉及到补丁的更新和修改,如果能搞清楚这些问题,那在项目初期就尽量能考虑或者规避这方面的问题。
[/Quote]
这种一般不能依赖于代码的理解,不然就不需要所谓的regressive test,所以如果对于dll的改动,它依赖的module都会有很大影响,所以需要仔细测试...
oyljerry 2009-01-09
  • 打赏
  • 举报
回复
1,增加成员变量,也会修改类对象的内存布局,所以也需要重新编译
yajyjy 2009-01-09
  • 打赏
  • 举报
回复
有些情况下,即使不重新编译,这个dll在其它模块也是能运行的,但是不能保证这个dll能稳定运行,这也加大了写代码验证的难度。
同时写代码验证固然重要,但是如果从纯理论的角度能确认这些问题更好,对吧?
在一个大型的工程项目中,经常会涉及到补丁的更新和修改,如果能搞清楚这些问题,那在项目初期就尽量能考虑或者规避这方面的问题。
一名程序员 2009-01-09
  • 打赏
  • 举报
回复
自己写个dll的测试用例,测试一不就行了?有些东西不是靠理论推导就能符合实际情况的。
fandh 2009-01-09
  • 打赏
  • 举报
回复
通常封装一个库之后,很多模块会使用到这个库。假设其它模块静态调用使用这个库,我的理解是:
1.如果只是修改了这个库文件中的cpp文件,在更新这个库给其它模块使用时,不需要更新.h和.lib重新进行编译链接,只需要更新dll给其它模块运行时使用;
2.如果在.h和.cpp文件中增加了外部接口函数,在更新dll时,要同步更新.h和.lib重新进行编译链接;

这个是肯定的!

另外,未知的问题,我认为是都要的,希望高手能帮忙解答!
danxuezx 2009-01-09
  • 打赏
  • 举报
回复
我知识粗略的知道一些,细节不是很清楚,帮顶

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧