引入库LIB的原理 (求详解)
求助学术型选手
问题有些不太好描述
引入库.LIB文件在编译连接的时候,是否是相当于在程序刚启动时
增加了一段 LoadLibrary 其对应的.dll文件的代码?
同时在调用其包涵的函数时,CALL 此函数的地址?
问题来了,函数地址随着加载的时间不一样是会发生变化的,如何保证其准确性
不同版本的导入库,如:
V1.0中 有 fun1,fun2,
V2.0中 有 fun1, fun2,fun3
我程序使用的是V1.0的lib,用到了fun2函数
运行该程序的机器上只有V2.0的DLL,可以正常使用,这样使用是否正确,为什么?
[解决办法]
只要V1.0中的fun2与V2.0中fun2,函数名(C风格)相同并且参数列表完全一致,那就可以正常使用
[解决办法]
你说的lib应该不是通常所说的静态链接库,而是动态链接库附带生成的导入库文件lib,使用dll的方式采用静态加载。
原则上,只要到处函数(dll中)的签名没有更改,就不用重新编译调用程序,上例中如果v2版本的fun2签名没变,只是多了一个fun3,那么宿主调用程序可以正常使用v1版本的fun2,但是fun3报错
[解决办法]
关键看你的V1.0,和V2.0 有何不同,如果只是修改了Bug,逻辑不变,结果相同,那没有问题。
如果你的程序改变了逻辑,相应的exe 没有改变使用方式,那就是不兼容的代码。
如果你的不同版本的exe,都没有问题,而且符合要求,只要你的DLL和Windows版本不冲突;
和MFC,VC不冲突。
那么用哪个 lib都没有问题。
v1.0和v2.0的lib 的主要不同,是你的DLL可能会增加函数;
正常情况下,为了保持DLL的兼容性,你是不会删除导出函数的,也不会改变函数的导出位置的。
这样生成的v1.0和v2.0的lib也是兼容的。即相同函数的导入表也是相同的。
所以使用v1.0 的lib编译的exe 是完全可以,直接调用V2.0的DLL的。
如果 .exe 处理界面 .dll 处理逻辑, 这就是模块化开发了。
那么 .exe 和 .dll 可以分别开发,互不影响。
旧版本的 exe 可以使用新版本的 dll
新版本 exe 也可以使用旧版本的 dll
条件是逻辑不能变,互相间是兼容的。
当然最新版本的 exe 当然还是要使用最新版的 dll的,导入库自然,也要用最新版的了。
这样才能够增加,软件的加新功能嘛。