位置: 编程技术 - 正文

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小技巧)

  • 金税盘的会计科目
  • 房产税税源信息采集错误已到申报期怎么办
  • 无形资产开发阶段计入什么科目
  • 金税盘费服务费记入什么科目
  • 跨期两年的发票怎么处理
  • 餐费补贴要交个人所得税吗
  • 增值税专用发票的税率是多少啊
  • 期间费用分析方法有哪些
  • 赠送电影票的说辞
  • 企业注销合适还是转让出去合适
  • 股票回购后多久注销
  • 营改增后在建工程转让应缴纳税费有哪些
  • 建筑工程总包单位招聘
  • 不是本公司员工
  • 工会经费计税依据是应发工资还是实发工资
  • 营改增安装服务费税率
  • 净利润亏损怎么结转
  • 小规模纳税人季度申报表怎么填
  • 本期增加固定资产原值
  • 垫付按揭保证金怎么做账
  • 工程建造过程中发生的在建工程人员工资180万尚未支付
  • 企业报税表
  • 企业所得税法的主要内容
  • 职工食堂的费用可以抵税吗
  • 公司产生的劳务费如何计算个人所得税
  • 在win7系统中,添加打印机驱动程序
  • 股票的交易费用是怎么算的
  • 开增值税专用发票必须走公账吗
  • 固定资产的主要特征有哪些
  • php的变量
  • 库存现金清查主要包括哪些内容
  • 进项税额是
  • 简易办法征收增值税政策的通知
  • php快速排序原理
  • nodejs c扩展
  • php自动生成文章
  • 身份证校验python代码
  • 职工福利能开专票吗
  • 收到稳岗补贴如何入账
  • 非流动资产基金属于什么科目
  • 税控服务费电子普票能抵扣吗
  • 印花税怎么计提记账
  • 房产税征收标准2020
  • 事业单位取暖费2023
  • 合并企业如何缴纳印花税
  • 利息收入缴纳税率怎么算
  • 举办活动的工作要求
  • 社保补差什么流程
  • 发票跨年红冲 交税
  • 一季度存款
  • 银行汇票后面怎样背书盖章
  • 金蝶旗舰版如何备份账套
  • 行政事业单位负责人应当对本单位内部控制
  • 无票收入怎么报增值税
  • 怎么设置库存限额
  • 违反会计规定承担责任
  • mysql error1418
  • sql2000语句
  • mysql5.7.32免安装教程
  • cmd提示符基础知识
  • 地热不热怎么办一招教你解决
  • windows10正式版
  • nhaspx.exe是什么
  • windows越狱软件
  • win10多屏设置方法
  • win8系统打不开exe
  • macbookair文档怎么变成word
  • 服务win10
  • macosmajove
  • mac系统怎么创建用户
  • 如何检测电脑能否上网
  • win10怎么切任务管理
  • win101903更新安装失败
  • unity连接数据库能做什么
  • python可变参数和不可变参数
  • unity 3d教程
  • 响应鼠标变换表怎么用
  • 怎么在国税网站取消已申报的财务报表
  • 贵州银行短信服务怎么开通
  • 广东省电子税务局官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设