C++ 动态链接库、静态链接库那些事情

C++ 动态链接库、静态链接库那些事儿
本帖最后由 femic 于 2014-08-22 11:03:14 编辑
假设A是应用本身,B是动态链接库,C是静态链接库
A链接了C, B也链接了C
C里面有一个c语言写的全局函数
A和B都调用这个。
但是调试时,发现调用的地址不相同,为什么呢?
顺便还发现了一个问题,A和B都调用一个模板头文件,同样的情况
,调用时候内部地址也不一样,是不是一个问题呢?
------解决方案--------------------
这么说吧,动态链接库是在应用程序加载时映射到进程的地址空间的,多个进程可以共用动态库的代码段(不会共用数据段,操作系统可能有Copy-on-Write机制)。应用程序链接时若指定了静态链接库,那么此时编译器会把静态库库中用到的代码数据拷贝到应用程序的可执行文件中,结合成一个整体,编译结束后,静态连接库就可以扔掉了,但是动态链接库不行。
------解决方案--------------------
如果 B 导出了 她引用 C 里面的函数,那么可以直接从 B 导出到 A 来使用。
此时 A 本身就没有 C 库代码。

如果 B 没有导出其引用 C 里面的函数,那么你也无法得知 B 是否包含 C。也就没有你所说的情况了。

如果 A、B、C 都是你自己写的,那么就是你项目架构有问题了。