请问,ld链接生成的时候,加载动态库/静态库顺序如何?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问,ld链接生成的时候,加载动态库/静态库顺序如何?相关的知识,希望对你有一定的参考价值。

想了解,如果-lm 命令的时候,同时有libm.a和libm.so的话,实际上用哪个?我在solaris上面做的试验,如果两个同时存在,则选择libm.so。如果只有libm.a那么-lm就是链接libm.a问题: 所有平台都是这样的么? 还是和我的具体使用的编译器或者是场景有关? 谢谢!实验如下-------------------------------------------------------------------------> cat n.c#includevoid f()printf("fdynamicn");> gcc --share -c n.c> gcc -G -o libm.so n.o> cat m.c#includevoid f()printf("fstaticn");> gcc -c m.c>ar -r libm.a m.o> cat a.cint main(void)f();> gcc a.c -o main -L. -lm>./mainfdynamic--------------------------------------------------------------------------如果mv libm.so libm.so.keep再gcc a.c -o main -L. -lm>./mainfstatic

参考技术A gcc默认使用动态库方式链接,找不到动态库才会去找静态库,若要使用静态库需给链接器指定参数-static。

动态链接及静态链接

静态链接就是在编译链接时直接将需要的执行代码拷贝到调用处,优点就是在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行,但是体积可能会相对大一些。


动态链接就是在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,

然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码,最终达到运行时连接的目的。优点是多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝,缺点是由于是运行时加载,可能会影响程序的前期执行性能。

以上是关于请问,ld链接生成的时候,加载动态库/静态库顺序如何?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用cmake生成基于静态库的动态链接库

Linux下C/C++动态库在运行时是怎样加载进来的

LD_PRELOAD加载动态库

LD_PRELOAD加载动态库

Linux动态链接和静态链接简析

[转载] 动态链接库dll的 静态加载 与 动态加载