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相关的问题相关推荐

  1. 一文详解目标跟踪中的相关滤波

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文来源:AI干货知识库 / 导读 / 目标跟踪是计算机视觉领域的一个重要问题,目前广泛应用在体育赛事 ...

  2. SAP SD基础知识之订单中装运相关的功能 II

    SAP SD基础知识之订单中装运相关的功能 II 一,计划Scheduling 当业务人员创建一张订单时,系统能够决定基于客户要求的delivery date的物料可用日期:需要交货的货物必须在该时点 ...

  3. SAP SD基础知识之订单中装运相关的功能 I

    SAP SD基础知识之订单中装运相关的功能 I 一,装运点决定Shipping Point Determination 每个订单行项目都会决定一个shipping point:系统会自动带出一个shi ...

  4. 网络推广外包专员浅析如何在网络推广外包中获得相关关键词?

    当企业客户想要针对所在行业建设官网并获取网站排名优化效果时,就要获取相关得关键词作为优化重点.在该行业中想要确定关键词去进行优化,首先要整合大量相关关键词,根据企业具体经营产品或服务情况进行筛选,确定 ...

  5. shell中$XX相关

    shell中$XX相关 shell中$* $@和$#还有好多. $* 这个程式的所有参数 $# 这个程式的参数个数 $@ 跟$*类似,但是可以当作数组用 举例说: 脚本名称叫test.sh 入参三个: ...

  6. Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块...

    Linux中mod相关的命令 内核模块化   mod相关命令都是用来动态加载内核模块/驱动程序模块 http://baike.baidu.com/link?url=lxiKxFvYm-UfJIxMjz ...

  7. iOS系统库头文件中NS_AVAILABLE相关

    原文链接: iOS系统库头文件中NS_AVAILABLE相关 简书主页:http://www.jianshu.com/users/37f2920f6848 Github主页:https://githu ...

  8. c语言中条件编译相关的预编译指令

     一. 内容概述 本文主要介绍c语言中条件编译相关的预编译指令,包括#define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. 二. ...

  9. 在Spring Boot中实现相关ID(用于SOA /微服务中的分布式跟踪)

    上周参加了在Geecon上Sam Newman的微服务讨论后,我开始思考更多有关用于监视,报告和诊断的面向服务/微服务平台最可能的基本功能:相关ID. 关联ID允许在面向服务的复杂平台中进行分布式跟踪 ...

  10. Xcode中指令集相关选项

    Xcode中指令集相关选项(Build Setting中) (1)Architectures Space-separated list of identifiers. Specifies the ar ...

最新文章

  1. 事件标志组解决任务间资源共享问题
  2. LNMP Nginx 499 问题 第三方回调异常
  3. poj 3278 Catch That Cow (bfs)
  4. 什么是数字孪生,它的应用价值在哪里?
  5. day055056Django之多表操作,多表查询
  6. 导出csv文件时,处理分隔符问题(转)
  7. web安全day33:人人都要懂的LNMP--nginx的配置和文件理解
  8. 【LeetCode】【字符串】题号:*640. 求解方程
  9. mapreduce数据压缩
  10. 小甲鱼Python教程,截图+代码+学习笔记,Python入门【10000字】【原创】
  11. 数据库系统设计大作业:图书馆管理系统
  12. 淘宝SKU组合查询算法实现
  13. 使用kaptcha快速生成验证码
  14. Python爬取校花网
  15. wsl2中安装QGC
  16. 为什么onenote一直在加载_OneNote: 沉睡于电脑中的宝藏笔记软件,高效管理你的学习生活...
  17. Subversive or Subclipse
  18. 2022考研笔记-政治(马原-马克思主义哲学)
  19. vue中的slot(插槽)详解
  20. 大数据分布式计算开源框架Hadoop的介绍和运用

热门文章

  1. eclipse启动tomcat无法访问的解决方法(转)
  2. 基于visual Studio2013解决C语言竞赛题之0701排队输出
  3. java兔子问题流程图_求龟兔赛跑的流程图 高手进来瞧瞧啊
  4. 安卓listview点击空白事件_王者荣耀安卓苹果ios改空白名;重复名字特殊昵称教程...
  5. JMJS系统总结系列----XSLT的语句规则(一)
  6. python3连接redis
  7. 输入法或搜索类软件评价
  8. [转] Async/Await替代Promise的6个理由
  9. 【二 HTTP编程】2. HTTP路由
  10. Intellij IDEA创建包(package)问题解决方案