我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何理解Linux系统下连接器ld链接顺序

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何理解Linux系统下连接器ld链接顺序

本篇内容主要讲解“如何理解Linux系统下连接器ld链接顺序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Linux系统下连接器ld链接顺序”吧!

  原来ld对于链接一系列的库的顺序是很敏感的,不然会报undefined referenced 的函数符号错误,意思就是未找到函数定义。实际上库是能正确打开的。如果库libA.a依赖于库libB.a,那么连接器的参数应该ln -lA -lB,   必须这样写。不然就会错误。

  这个看来是历史的遗留问题。说白了就是,如果你确定某个库不重要,就放到最后,也就是说,库的加载顺序是按顺序进行的,从左到右,优先级最高,这也是远古时代机器太破的原因,内在和硬盘包括CPU都是极其稀罕珍贵的。所以要你提前搞定哪些需要哪些不需要,一旦需要,就加载上去,不需要就不要加载上去。这样就可以解释上面的错误了,编译器加载到socketcomm后,发现还有依赖库,再往后找,木有咧,于是就错了。

  也就是说,被依赖的尽量放到后面,让大家可以共用。

  这就引申同来了另外一个问题,如果有多个库,使用了相同的函数名或者类名,结构体名称会怎么样?

  可以使用nm和readelf、ldd等命令来查看你的库的依赖和符号表以及导出的函数符号等。这样就可以来验证上面的因为顺序造成的不同的编译结果。

  把测试的库分成动、动;静、静;动静三种情况

  第一种情况:静静库都包含有相同的名字函数

代码如下:

  gcc -L./ main.c -lA -lB

  编译报错,在multiple definition of `XXX‘。重复定义函数。

  第二种情况:动动库

  这个得看加载的顺序,上面说过,从左开始,按需加载。

代码如下:

  gcc main.c ./libB.so ./libA.so

代码如下:

  gcc main.c ./libA.so ./libB.so

  这样的链接方式为隐式链接,或者说加载时链接,而前面的静态库为编译时连接。

  也就是说,编译的顺序确定到底调用哪个库中的同名函数。

  第三种情况:动动,但是是动态加载,而不上面的静态加载。

代码如下:

  gcc main.c -ldl ./libA.so ./libB.so

代码如下:

  gcc main.c -ldl ./libB.so ./libA.so

  没有加链接选项时,跟第二种情况一样。加了L选项后,指定哪上加载哪个。

  libB为静态链接!, libA为动态加载.

代码如下:

  gcc -L./ main.c -ldl –lB

  动态库的库名显示的加载入编译选项中

代码如下:

  gcc -L./ main.c -ldl -lB ./libA.so

代码如下:

  gcc -L./ main.c -ldl ./libA.so -lB

到此,相信大家对“如何理解Linux系统下连接器ld链接顺序”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何理解Linux系统下连接器ld链接顺序

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何理解Linux系统下连接器ld链接顺序

本篇内容主要讲解“如何理解Linux系统下连接器ld链接顺序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Linux系统下连接器ld链接顺序”吧!  原来ld对于链接一系列的库的顺序是很
2023-06-13

Linux系统连接Redis命令如何理解

Linux系统连接Redis命令如何理解,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 Redis 可以支持如下连接方式:通过客户端工具连接、通过数据库管理工具 DMC 连
2023-06-28

Linux下如何管理系统服务启动顺序

在Linux下,有多种方法可以管理系统服务的启动顺序使用systemd:Systemd是现代Linux发行版的默认初始化系统,它可以管理服务的启动顺序。要使用systemd管理服务启动顺序,请执行以下操作:创建或编辑服务的systemd单元
Linux下如何管理系统服务启动顺序
2024-09-25

Linux系统下如何检测U盘是否已连接

这篇文章给大家分享的是有关Linux系统下如何检测U盘是否已连接的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Linux的文件系统是异步的,也就是说写一个文件不是立刻保存到介质(硬盘,U盘等)中,而是存到缓冲区内
2023-06-17

如何检测在Linux系统下U盘是否已连接

这篇文章主要为大家展示了“如何检测在Linux系统下U盘是否已连接”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何检测在Linux系统下U盘是否已连接”这篇文章吧。Linux的文件系统是异步的
2023-06-17

如何在Linux系统下命令行中实现Wifi连接

这篇文章主要讲解了“如何在Linux系统下命令行中实现Wifi连接”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何在Linux系统下命令行中实现Wifi连接”吧!无论何时要安装一款新的 L
2023-06-13

如何解决Linux系统中连接超时的问题

本篇内容主要讲解“如何解决Linux系统中连接超时的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决Linux系统中连接超时的问题”吧!  IPv6被认为是IPv4—&md
2023-06-13

如何解决win8.1系统下连接两次才能上网及错误651

不少用户遇到这样一个问题,自从升级了win8.1系统之后,每次开机都需要连接两次才能正常上网,有时候还会遇上错误651,上个网实在伤不起,怎样才能解决这个错误651问题呢,让我们来看下下面的解决步骤吧。第一步、按windows+R键,在运行
2022-06-04

Linux系统远程如何连接Oracle服务器进行配置监听及本地网络服务

这篇文章的内容主要围绕Linux系统远程如何连接Oracle服务器进行配置监听及本地网络服务进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!1**.配
2023-06-28

如何解决MySQL报错:与MySQL服务器的连接断开,系统错误:错误编号

MySQL报错“与MySQL服务器的连接断开,系统错误:错误编号”可能是由于以下几个原因导致的:1. MySQL服务器未正常运行:检查MySQL服务器是否正在运行。可以尝试重启MySQL服务,确保MySQL服务器正常启动。- 在Window
2023-10-12

Lost connection to MySQL server at 'host', system error: errno - 如何解决MySQL报错:与MySQL服务器的连接断开,系统错误:错误编

如何解决MySQL报错:与MySQL服务器的连接断开,系统错误:错误编号,需要具体代码示例引言:MySQL是一种流行的开源关系型数据库管理系统,用于在各种应用程序中存储和管理数据。然而,在与MySQL服务器建立连接时,有时会遇到连接断开的问
2023-10-22

Lost connection to MySQL server at 'host', system error: errno - 如何解决MySQL报错:与MySQL服务器的连接断开,系统错误:错误编

引言:MySQL是一种流行的开源关系型数据库管理系统,用于在各种应用程序中存储和管理数据。然而,在与MySQL服务器建立连接时,有时会遇到连接断开的问题,并且系统会报告一个具体的错误编号。本文将介绍一些常见的解决方法,并提供一些具体的代码示
2023-10-21

编程热搜

目录