位置: 编程技术 - 正文

Linux系统下 连接器ld链接顺序的总结(linux 命令连接)

编辑:rootadmin

推荐整理分享Linux系统下 连接器ld链接顺序的总结(linux 命令连接),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:linux连接linux,连接linux命令,linux链接ln,连接linux命令,linux连接工具有哪些,linux连接工具有哪些,linux连接linux,连接linux命令,内容如对您有帮助,希望把文章链接给更多的朋友!

  原来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

Linux系统下 连接器ld链接顺序的总结(linux 命令连接)

复制代码代码如下:  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

  在有静态和动态时,不把动态库库名显示加入编译选项,输出是正常的,如果加进去以静态库为主和link顺序无关。谢谢阅读,希望能帮到大家,请继续关注积木网,我们会努力分享更多优秀的文章。

Linux系统下怎么用CheckInstall从源码创建一个RPM或DEB包 问题:我想要从源码创建安装的软件包。有没有一种方式从源码来创建和安装软件包,而不是运行makeinstall?这样的话,以后如果我想,我可以容易的卸

Linux系统配置 Linux访问控制列表(ACL)的权限控制方法 使用拥有权限控制的Liunx,工作是一件轻松的任务。它可以定义任何user,group和other的权限。无论是在桌面电脑或者不会有很多用户的虚拟Linux实例,或者

在linux系统下利用PC机实现路由转发的具体步骤 1、网络拓扑网络拓扑如下所示,我们在这里用到了三台机子做实验,分别是①、④、⑦号机,使用①号机ping⑦号机,④号机作为路由转发。2、错误的

标签: linux 命令连接

本文链接地址:https://www.jiuchutong.com/biancheng/366964.html 转载请保留说明!

上一篇:Linux系统命令中exit与exit的区别(linux命令eof)

下一篇:Linux系统下怎么用CheckInstall从源码创建一个RPM或DEB包(linux小技巧)

  • 航信金税盘时间校准
  • 印花税是根据什么征收的
  • 环境保护税属于什么税种
  • 应收账款转为其他应收款
  • 贷款利息不能抵扣进项税
  • 房地产开发企业预收款预缴增值税
  • 企业报废固定资产的净损失应确认为企业的费用
  • 权益法下股权投资
  • 销售亏损原因分析范文
  • 收到客户银行按时到账
  • 收入跨期审计调整分录如何滚调
  • 资产减值损失和信用损失的区别
  • 出口退税的原则是什么
  • 个体户要交国税和地税吗
  • 售楼部购买空调计入哪个科目
  • 资产负债表和业务活动表勾稽关系不对怎么查
  • 投资决策中常用的指标有
  • 固定资产折旧从入账时间算还是购入时间算
  • 公司没有实缴可以破产么
  • w11如何激活
  • Win10 64位正式版系统安装方法全过程图解(U大师)
  • mac u盘
  • 企业所得税按月或者按季预缴
  • win11系统怎么投屏
  • 财务费用利息收入怎么结转
  • Sublime Text v4.0(4143)破解方法
  • 融资a轮之前
  • 无法将node项识别为
  • 预收账款的账务处理摘要
  • PHP:finfo_buffer()的用法_fileinfo函数
  • 申报补缴是什么意思
  • 以不动产作价出资入股
  • php获取另一个php返回内容
  • 电子税务局增值税申报流程
  • 单图像三维重建
  • 小企业会计准则适用于哪些企业
  • 93.transformer、多头注意力以及代码实现
  • 视觉slam十四讲笔记
  • php访问sqlserver
  • javaweb:jquery中ajax的应用
  • 绿化苗木抵扣税是多少
  • 权益法的比例是多少
  • 小规模纳税人开专票需要交税吗
  • 国外商贸公司
  • Testing Applications with WebTest¶
  • 间接费用允许调整吗
  • 增值税普票怎么开演示
  • sql删除表中的某一行
  • 应收账款账龄计提坏账比例
  • 工会支付职工福利费做账
  • 建安企业费用有哪些
  • 未分配利润转增股本要交税吗怎么交
  • 现金流量表每月要报吗
  • 发票抵扣联要放入凭证里吗
  • 买二手办公用品
  • 业务招待费是销售
  • 怎么去掉0前面的逗号
  • sql集合包含关系
  • mysql 错误1067
  • 该怎么配置
  • 打开电脑windows
  • Windows移动中心里没有无线网络
  • linux安装syslog
  • skydrive官网登录
  • postgres.exe是什么进程 postgres进程查询
  • Win7如何安装音频设备
  • 台式装win7
  • jQuery ajax读取本地json文件的实例
  • cocos2dx 3.2 Http网络连接,curl 库的介绍
  • css控制html
  • 简述linux与windows相比,有哪些优势
  • numpy使用心得
  • js设计模式有什么用
  • 地税网上办税服务厅
  • 增值税发票综合服务平台登录不了
  • 江苏电子税务局网站官网
  • 甘肃增值税发票查验平台官网
  • 医保报销是按自然年计算吗
  • 进一步深造是什么意思
  • 陕西省税务电话是多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设