美文网首页嵌入式编程
ld链接库的顺序

ld链接库的顺序

作者: 罗蓁蓁 | 来源:发表于2020-08-03 17:34 被阅读0次

这次讲讲ld链接库,没想到吧,链接库时的顺序很重要,而为了让顺序不辣么重要,所有了解--start-group很重要。

-( ARCHIVES -)'--start-group ARCHIVES --end-group'

ARCHIVES 应当是一个关于档案文件的列表. 它们可以是显式的文件名,或者'-l'选项。这些指定的档案文件会被多遍搜索,直到没有新的无定义引用被创建。

通常,一个档案文件只会被搜索一次。 但如果这个档案文件中的一个符号需要被用来解析一个档案中的目标引用到的无定义的符号,而这个符号在命令行上的后面某个档案文件中出现, 连接器不能解析这个引用。把这些档案文件分组后,它们都可被反复搜索直到所有可能的引用都被解析了为止。

使用这个选项有一个很大的运行开销. 只有在无法避免在多个档案文件中使用循环引用时才用它。

这是在工具链接的其它中:


1.png

这是在工具链接的库中:


2.png

这是指定放在makefile中,并且在—start-group外面,顺序为-lsecond –lstatic,其中second中的函数引用,定义在static中:


3.png

这是指定放在makefile中,并且在—start-group外面,顺序为-lstatic -lsecond:


4.png

由此可见,--start-group ARCHIVES --end-group,的确起到了多个档案文件中使用循环引用时,保证正确。如果不用它,那么链接的顺序一定是:先链接调用该函数的库,再链接定义该函数的库。

另外,链接库的方式我知道有两种:

  1. 直接使用绝对路径下的文件。比如:

    F:/workspace/6.1.3.2/platform/workspace/libsecond.a。

  2. 使用-l参数,比如-lsecond。

如果ld加了参数-non-static,那么默认的-lsecond,会优先搜索second.so,如果找不到会再搜索second.a。

另外,我考虑掉了一种情况,即在两个库中拥有同样的函数,那么这样的话,如果需要用到接口时,ld会去链接,哪个库放前面,就先找哪个库中的函数。此时,不管在—start-group里,或者不在,都不重要了,在前面的库的函数将优先被引用。

这里有个重点是需要注意的:

那就是,链接的最小单元一般是文件,*.o。那么,如果a.o和b.o同时存在test1(),a.o和b.o存在于不同的库,那么ld会去链接,哪个库放前面,就先找哪个库中的函数。

但是!如果a.o和b.o同时存在test1(),但是a.o有test2(),b.o有test3(),结果这两个接口函数都会被系统使用,那么a.o和b.o就会被同时链接进去。这就是为何会报多重定义的错误。

相关文章

  • ld链接库的顺序

    这次讲讲ld链接库,没想到吧,链接库时的顺序很重要,而为了让顺序不辣么重要,所有了解--start-group很重...

  • ld链接库

    ld链接库 `-( ARCHIVES-)'`--start-group ARCHIVES --end-group'...

  • library not found for -lXXXXXXXX

    ld: library not found for xxxx 报错总体来说分为两类原因: 1 编译时找不到链接库报...

  • gcc编译安装时,报错 configure-stage1-tar

    问题原因:动态链接库中缺少libmpfr.so.1 解决办法:libmpfr.so.1的地址加到LD_LIBRAR...

  • so库加载原理

    有关编译时so库加载的内容: /etc/ld.so.conf 此文件记录了编译时使用的动态链接库的路径,更直白的说...

  • 【转载】etc/ld.so.conf的使用说明 libcudn

    etc/ld.so.conf: 这个文件记录了编译时使用的动态链接库的路径。 默认情况下,编译器只会使用/lib和...

  • Makefile 中动态链接库的顺序

    Makefile 中编译选项的位置可以随意变化,但是动态链接库之间的相对位置有讲究。 比如在编译一个项目时遇到错误...

  • 干货|专业音响设备(系统)调试技巧

    音响设备开、关机顺序 按由前到后顺序开机,即由音源设备(CD机、LD机、DVD机、录音机、录像机)→音频处理设备(...

  • sqlite3使用总结

    sqlite3总结 注:以下仅是个人观点,不权威 源码下载 交叉编译 按顺序执行上述命令后sqlite的链接库和头...

  • Linux动态库搜索路径

    Linux按如下顺序搜索动态库 1. 链接选项: -rpath 2. 环境变量:LD_LIBRARY_PATH 3...

网友评论

    本文标题:ld链接库的顺序

    本文链接:https://www.haomeiwen.com/subject/bcrbrktx.html