大家好
把一个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
静态库里面如果依赖其它第三方的库,譬如C++的库,是不会被编译到.a文件里面的,因为每个静态库都依赖C++的库,如果都编译到.a文件中,就会造成空间上的浪费,还会导致符号冲突。
而动态库被程序加载后可以独立运行的,所以所有的C++或第三方的库都会被链接到.so文件里面,就会比静态库大了。
nm 命令可以查看哪些依赖被编译到了静态库中
readelf 既可以查看.a也可以查看.so文件的信息。