静态库和动态库

2021-08-09 13:30:58 浏览数 (1)

[x]静态库 .a : 从静态库中拷贝 对应的函数定义,即使对应机器上没有这个 库,也能运行;

静态库链接一般要放在最后面。

[x]动态库 .so : 运行时,动态加载的, 编译器只 “拷贝”一些重定位和符号表信息 , 若对应机器上没有这个库,则无法运

相关指令

代码语言:javascript复制
 [2021-07-24 14:50:19][PID:8229] [|- gcc ] 
------------------------------------------------------------------------------------------------------
 [2021-07-24 14:50:19][PID:8229] [gcc 目标文件三种形式] 
 [2021-07-24 14:50:19][PID:8229] [可执行目标文件。即我们通常所认识的,可直接运行的二进制文件] 
 [2021-07-24 14:50:19][PID:8229] [可重定位目标文件。包含了二进制的代码和数据,可以与其他可重定位目标文件合并,并创建一个可执行目标文件] 
 [2021-07-24 14:50:19][PID:8229] [共享目标文件。它是一种在加载或者运行时进行链接的特殊可重定位目标文件] 
======================================================================================================
 [2021-07-24 14:50:19][PID:8229] [|- locate ] 
 locate  libm.so 

 readelf -h /lib/x86_64-linux-gnu/libm.so.6 共享目标文件 
 [2021-07-24 14:50:19][PID:8229] [静态链接] 
 gcc -static -o main main.o -lm 

 [2021-07-24 14:50:19][PID:8229] [动态链接 (默认)] 
 gcc -o main main.c -lm #默认使用的是动态链接 


 gcc -c main.c #生成可重定位目标文件(readelf -h main.o ) 
 gcc -o main main.o -lm (链接 libm.a or libm.so, 一定要放最后面,先提取未知的符号,再在库中 查找 符号定义) 
 readelf -h main (查看ELF 文件的头) 

 [2021-07-24 14:50:19][PID:8229] [|- ldd ] 
 ldd main (查看链接了哪些库) 

0 人点赞