浅谈静态库和动态库之间的调用关系

在linux编程过程中,经常会遇到静态库和动态库之间的相互调用问题。

库与库之间的相互调用大致可分为下列四中情景:

静态库调用静态库(Test—>.a1—>.a2)

在链接生成 Test 时,Test 会把 .a1 的代码实现部分包含进来,再递归,把 .a1 中关联的 .a2 的代码实现部分也包含到 .a1 里。

运行 Test 时,不再需要 .a1 和 .a2 。

Test  ——>  .a1   ——>  .a2

静态库调用动态库(Test—>.a—>.so)

在链接生成 Test 时,Test 会把 .a 的代码实现部分包含进来,但是与 .a 关联的 .so 的代码实现部分不会被包含到 .a 里。

运行Test时,不再需要 .a ,但需要 .so 。

Test  ——>  .a   ——>  .so

动态库调用静态库(Test—>.so—>.a)

在链接生成 Test 时,Test 不会把 .so 的代码实现部分包含进来,但是与 .so 关联的 .a 的代码实现部分会被包含到 .so 里。

运行Test时,需要 .so ,但不再需要 .a 。

Test  ——>  .so  ——>  .a

动态库调用动态库(Test—>.so1—>.so2)

在链接生成 Test 时,Test 不会把 .so1 的代码实现部分包含进来,同理,与 .so1 关联的 .so2 的代码实现部分也不会被包含到 .so1 里。

运行Test时,.so1和.so2都需要 。

Test  ——>  .so1  ——>  .so2

PS: 静态库 .a 会被链接到动态库 .so或者 exe中。

猜你喜欢

转载自blog.csdn.net/weixin_44937328/article/details/113751995