zl程序教程

您现在的位置是:首页 >  其他

当前栏目

C/C++ 静态库和动态库的区别

2023-04-18 14:06:08 时间

 可执行目标文件

可重定位目标文件

共享目标文件

 

静态库和动态库的区别:

生效阶段不同,静态库是在编译阶段就会把其链接到可执行目标文件中;动态库是在程序运行过程中指定路径或者系统动态库路径下寻找。

 

-lm 链接math动态库,在程序运行时去找系统动态库路径下的所有动态库,看有无要找的符号

 

比如静态链接:

gcc -static -o main main.o -lm

在这个过程中,就会用到系统中的静态库libm.a。这个过程做了什么呢?首先第一条命令会将main.c编译成可重定位目标文件main.o,第二条命令的static参数,告诉链接器应该使用静态链接,-lm参数表明链接libm.a这个库(类似的,如果要链接libxxx.a,使用-lxxx即可)。由于main.c中使用了libm.a中的exp函数,因此链接时,会将libm.a中需要的代码“拷贝到最终的可执行文件main中。

由于最终生成的可执行文件中已经包含了exp相关的二进制代码,因此这个可执行文件在一个没有libm.a的linux系统中也能正常运行。

 

比如把-lm放在后面,链接器只会一直向后查找符号,如果-lm放前面,那么就会编译链接出错

 

ldd命令可以查看可执行文件链接了哪些动态库。

 

 

动态库和静态库类似,但是它并不在链接时将需要的二进制代码都“拷贝”到可执行文件中,而是仅仅“拷贝”一些重定位和符号表信息,这些信息可以在程序运行时完成真正的链接过程。

 

 

静态库中被使用的目标代码最终和可执行文件在一起(它只会有自己用到的),而动态库与它相反,它的目标代码在运行时或者加载时链接。

  浅谈静态库和动态库 - 知乎