静态链接库.a文件 动态链接库.so文件 定义

显然一个是静态链接库(.a),一个是动态链接库(.so)

联系和区别

相同点:链接库本身不是最终的执行程序文件,而是为其他执行文件提供服务的程序。如果把最终的执行程序文件比作一个汽车生产厂家,那么链接库就可以理解为零部件提供商 。

不同点:静态链接库在链接阶段就直接打包到最终的执行程序文件中,而动态链接库则是在程序运行时去链接库里面找需要的东西。

优缺点:显然,静态链接的库文件会导致最终目标程序文件体积膨胀,优点是编译之后就不受原来静态库文件的影响,即使原来的静态库被删除了都没关系;

而动态链接库可以保证文件体积较小,在升级程序时很方便,但缺点是库文件和主程序分开,如果库文件不存在(删除、移动或重命名等)了,则主程序文件找不到而出现运行时错误。

测试

源文件都是一样的,来个CMakeLists.txt脚本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

cmake_minimum_required(VERSION 3.10)

 

set(projectName xddll)

set(targetName xddll)

 

# set the project name

project(${projectName}

VERSION 0.12

LANGUAGES CXX

)

 

# specify the C++ standard

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_CXX_STANDARD_REQUIRED True)

 

include_directories("${PROJECT_SOURCE_DIR}")

 

add_library(${targetName} STATIC

dllmain.cpp)

  注意最后面的那个add_library里面的STATIC,指导最终编译的是一个静态库。

然后在程序里面调用,没啥问题,删除库文件再执行,没啥问题,这就不给出详细的测试了。

如果把最后面的STATIC改为SHARED,编译链接好最终的执行程序,然后再删除.so文件以后,就会出现问题了:

 第一次检查到了动态链接库,运行也没问题,但是修改动态链接库的文件名以后,再使用ldd查看,发现 动态链接库挂了,然后运行执行文件,也挂了。

 如果分别用静态链接和动态链接方式生成最后的可执行文件,查看文件大小:  

  可以看到动态库确实会小一些(这个例子里面不太明显,毕竟这个库文件本身就很小)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值