交叉编译中libtool相关的问题
libtool 是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一、可移植的接口中;使用libtool的标准方法,可以在不同平台上创建并调用动态库。可以认为libtool是gcc的一个抽象,其包装了gcc(或者其他的编译器),用户无需知道细节,只要告诉libtool需要编译哪些库即可,libtool将处理库的依赖等细节。libtool只与后缀名为lo、la为的libtool文件打交道。
libtool主要的一个作用是在编译大型软件的过程中解决了库的依赖问题;将繁重的库依赖关系的维护工作承担下来,从而释放了程序员的人力资源。libtool提供统一的接口,隐藏了不同平台间库的名称的差异等细节,生成一个抽象的后缀名为la高层库libxx.la(其实是个文本文件),并将该库对其它库的依赖关系,都写在该la的文件中。该文件中的dependency_libs记录该库依赖的所有库(其中有些是以.la文件的形式加入的);libdir则指出了库的安装位置;library_names记录了共享库的名字;old_library记录了静态库的名字。
当编译过程到link阶段的时候,如果有下面的命令:
$libtool --mode=link gcc -o myprog -rpath /usr/lib –L/usr/lib –la
libtool会到/usr/lib路径下去寻找liba.la,然后从中读取实际的共享库的名字(library_names中记录了该名字,比如liba.so)和路径(lib_dir中记录了,比如libdir=’/usr/lib’),返回诸如/usr/lib/liba.so的参数给激发出的gcc命令行。
如果liba.so依赖于库/usr/lib/libb.so,则在liba.la中将会有dependency_libs=’-L/usr/lib -lb’或者dependency_libs=’/usr/lib/libb.la’的行,如果是前者,其将直接把“-L/usr/lib –lb”当作参数传给gcc命令行;如果是后者,libtool将从/usr/lib/libb.la中读取实际的libb.so的库名称和路径,然后组合成参数“/usr/lib/libb.so”传递给gcc命令行。
当要生成的文件是诸如libmylib.la的时候,比如:
$libtool --mode=link gcc -o libmylib.la -rpath /usr/lib –L/usr/lib –la
其依赖的库的搜索基本类似,只是在这个时候会根据相应的规则生成相应的共享库和静态库。
注意:libtool在链接的时候只会涉及到后缀名为la的libtool文件;实际的库文件名称和库安装路径以及依赖关系是从该文件中读取的。
2 为何使用 -Wl,--rpath-link -Wl,DIR?
使用libtool解决编译问题看上去没什么问题:库的名称、路径、依赖都得到了很好的解决。但下结论不要那么着急,一个显而易见的问题就是:并不是所有的库都是用libtool编译的。
比如上面那个例子,
$libtool --mode=link gcc -o myprog -rpath /usr/lib –L/usr/lib –la
如果liba.so不是使用libtool工具生成的,则libtool此时根本找不到liba.la文件(不存在该文件)。这种情况下,libtool只会把“–L/usr/lib –la”当作参数传递给gcc命令行。
考虑以下情况:要从myprog.o文件编译生成myprog,其依赖于库liba.so(使用libtool生成),liba.so又依赖于libb.so(libb.so的生成不使用libtool),而且由于某种原因,a对b的依赖并没有写入到liba.la中,那么如果用以下命令编译:
$libtool --mode=link gcc -o myprog -rpath /usr/lib –L/usr/lib –la
激发出的gcc命令行类似于下面:
gcc –o myprog /usr/lib/liba.so
由于liba.so依赖于libb.so(这种依赖可以用readelf读liba.so的ELF文件看到),而上面的命令行中,并没有出现libb.so,于是,可能会出现问题。
说“可能”,是因为如果在本地编译的情况下,gcc在命令行中找不到一个库(比如上面的liba.so)依赖的其它库(比如libb.so),链接器会按照某种策略到某些路径下面去寻找需要的共享库:
1. 所有由'-rpath-link'选项指定的搜索路径.
2. 所有由'-rpath'指定的搜索路径. '-rpath'跟'-rpath_link'的不同之处在于,由'-rpath'指定的路径被包含在可执行文件中,并在运行时使用, 而'-rpath-link'选项仅仅在连接时起作用.
交叉编译中libtool相关的问题相关推荐
- 一文详解目标跟踪中的相关滤波
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文来源:AI干货知识库 / 导读 / 目标跟踪是计算机视觉领域的一个重要问题,目前广泛应用在体育赛事 ...
- SAP SD基础知识之订单中装运相关的功能 II
SAP SD基础知识之订单中装运相关的功能 II 一,计划Scheduling 当业务人员创建一张订单时,系统能够决定基于客户要求的delivery date的物料可用日期:需要交货的货物必须在该时点 ...
- SAP SD基础知识之订单中装运相关的功能 I
SAP SD基础知识之订单中装运相关的功能 I 一,装运点决定Shipping Point Determination 每个订单行项目都会决定一个shipping point:系统会自动带出一个shi ...
- 网络推广外包专员浅析如何在网络推广外包中获得相关关键词?
当企业客户想要针对所在行业建设官网并获取网站排名优化效果时,就要获取相关得关键词作为优化重点.在该行业中想要确定关键词去进行优化,首先要整合大量相关关键词,根据企业具体经营产品或服务情况进行筛选,确定 ...
- shell中$XX相关
shell中$XX相关 shell中$* $@和$#还有好多. $* 这个程式的所有参数 $# 这个程式的参数个数 $@ 跟$*类似,但是可以当作数组用 举例说: 脚本名称叫test.sh 入参三个: ...
- Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块...
Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块 http://baike.baidu.com/link?url=lxiKxFvYm-UfJIxMjz ...
- iOS系统库头文件中NS_AVAILABLE相关
原文链接: iOS系统库头文件中NS_AVAILABLE相关 简书主页:http://www.jianshu.com/users/37f2920f6848 Github主页:https://githu ...
- c语言中条件编译相关的预编译指令
一. 内容概述 本文主要介绍c语言中条件编译相关的预编译指令,包括#define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. 二. ...
- 在Spring Boot中实现相关ID(用于SOA /微服务中的分布式跟踪)
上周参加了在Geecon上Sam Newman的微服务讨论后,我开始思考更多有关用于监视,报告和诊断的面向服务/微服务平台最可能的基本功能:相关ID. 关联ID允许在面向服务的复杂平台中进行分布式跟踪 ...
- Xcode中指令集相关选项
Xcode中指令集相关选项(Build Setting中) (1)Architectures Space-separated list of identifiers. Specifies the ar ...
最新文章
- 事件标志组解决任务间资源共享问题
- LNMP Nginx 499 问题 第三方回调异常
- poj 3278 Catch That Cow (bfs)
- 什么是数字孪生,它的应用价值在哪里?
- day055056Django之多表操作,多表查询
- 导出csv文件时,处理分隔符问题(转)
- web安全day33:人人都要懂的LNMP--nginx的配置和文件理解
- 【LeetCode】【字符串】题号:*640. 求解方程
- mapreduce数据压缩
- 小甲鱼Python教程,截图+代码+学习笔记,Python入门【10000字】【原创】
- 数据库系统设计大作业:图书馆管理系统
- 淘宝SKU组合查询算法实现
- 使用kaptcha快速生成验证码
- Python爬取校花网
- wsl2中安装QGC
- 为什么onenote一直在加载_OneNote: 沉睡于电脑中的宝藏笔记软件,高效管理你的学习生活...
- Subversive or Subclipse
- 2022考研笔记-政治(马原-马克思主义哲学)
- vue中的slot(插槽)详解
- 大数据分布式计算开源框架Hadoop的介绍和运用
热门文章
- eclipse启动tomcat无法访问的解决方法(转)
- 基于visual Studio2013解决C语言竞赛题之0701排队输出
- java兔子问题流程图_求龟兔赛跑的流程图 高手进来瞧瞧啊
- 安卓listview点击空白事件_王者荣耀安卓苹果ios改空白名;重复名字特殊昵称教程...
- JMJS系统总结系列----XSLT的语句规则(一)
- python3连接redis
- 输入法或搜索类软件评价
- [转] Async/Await替代Promise的6个理由
- 【二 HTTP编程】2. HTTP路由
- Intellij IDEA创建包(package)问题解决方案