这可能是一个非常愚蠢的问题。 但是,假设我有一个DLL(test.dll),带有一些导出,在构build时会生成一个导入库(test.lib)。 我有一个使用此DLL的应用程序TestApp。
现在,如果我想在DLL中更改某些函数的实现,并且保持导出不变,那么是否需要重新生成使用此DLL / import lib的应用程序?
谢谢。
不,你不需要重建DLL。
考虑一下你的应用程序在Windows XP上运行,有一天Windows 7将会运行。 即使像user32.dll,kernel32.dll这样的系统DLL被更新,同样的应用程序仍然可以继续工作而不需要重建。
没有。 共享库(vs静态库)的目的之一就是这样:只要外部看不到变化(输出的定义/功能),使用它的应用就不需要重新编译。
如果这些函数是C函数,并且不更改正在传递的任何结构的定义,则不需要重新构建该应用程序。
如果DLL导出C ++类,那么导入模块确实需要重建 – 即使方法签名没有改变,C ++类的导出也是泄漏的:当为类分配空间时,没有定义的分配器函数被导出(由默认),因此在调用(Exported)构造函数之前,导入模块必须猜测分配了多少空间。 它通过解析类定义来建立这种猜测。
这个不幸的后果是,即使你只是小心地改变一个类的实现细节 – 即使方法签名将保持不变,并且DLL会成功加载,应用程序将在创建新实例时分配不正确的字节数在堆或堆栈上。