.so文件体积为什么大于.a文件?

大家好
把一个cpp源码编译为动态库,为什么比编译为静态库大很多?
用什么命令可以验证库文件中包含什么?

https://gitee.com/love2share/cmake3/blob/master/Mylib/mylib.cpp

以上源码编译为.a大小是1956 ,编译为.so大小是16040

命令:nm Mylib/libMylib.so                                                                                              
0000000000004028 b completed.7325
                 w __cxa_finalize@@GLIBC_2.2.5
0000000000001050 t deregister_tm_clones
00000000000010c0 t __do_global_dtors_aux
0000000000003dd0 t __do_global_dtors_aux_fini_array_entry
0000000000004020 d __dso_handle
0000000000003dd8 d _DYNAMIC
00000000000011d4 t _fini
                 U fprintf@@GLIBC_2.2.5
0000000000001100 t frame_dummy
0000000000003dc8 t __frame_dummy_init_array_entry
00000000000020c8 r __FRAME_END__
0000000000004000 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
0000000000002028 r __GNU_EH_FRAME_HDR
0000000000001000 t _init
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
0000000000001080 t register_tm_clones
                 U stdout@@GLIBC_2.2.5
0000000000004028 d __TMC_END__
0000000000001105 T _Z6mysqrtd
命令:nm ../libMylib.a                                                                                                       

mylib.cpp.o:
                 U fprintf
                 U stdout
0000000000000000 T _Z6mysqrtd
阅读 2.8k
1 个回答

静态库里面如果依赖其它第三方的库,譬如C++的库,是不会被编译到.a文件里面的,因为每个静态库都依赖C++的库,如果都编译到.a文件中,就会造成空间上的浪费,还会导致符号冲突。
而动态库被程序加载后可以独立运行的,所以所有的C++或第三方的库都会被链接到.so文件里面,就会比静态库大了。

nm xxxx.a

nm 命令可以查看哪些依赖被编译到了静态库中

readelf xxx.so

readelf 既可以查看.a也可以查看.so文件的信息。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题