linux下的静态库依赖

原创 2016年08月29日 20:21:33

linux下的静态库依赖

背景

linux的静态库.a和动态库.so的区别很大,静态库基本上只是一系列.o文件的集合加上符号表,没有链接过程,不能依赖链接其他的静态库或者动态库。如果静态库中用到了其他的库,需要这个静态库的使用者在最终的链接阶段清楚所有使用到的库,然后一一链接。

如果静态库依赖的库很多的话,而且依赖的关系很复杂,那么对于最终的使用者来说绝对是一场噩梦。

方案

linux下的静态库其实就是一系列.o文件的集合加上符号表。那么如果把它所依赖的静态库里的.o全部提取出来,然后再一起打包,更新符号表,是不是最终的使用者就可以不用管这些依赖了呢?
答案是的确可以,优点就是使用者不用去关心一堆静态库依赖,缺点是静态库的编写者需要花费更多的精力,并且静态库的体积会增大。

那么静态库依赖的动态库怎么办呢?
没有办法,静态库上没有链接信息,也不可能把动态库包含在里面,所以静态库如果真的依赖其他库,最好都依赖静态库。

打包

那么怎样将一个静态库打包到另一个静态库里呢?
静态库打包工具ar提供了-q选项来追加.o文件,理论上把所有依赖的静态库解开后打包是可行的,但是这样很难使用脚本来自动化打包,接下来我们使用一种很少见的方式来直接将.a添加到另一个.a中。
ar有一个选项-M,可以执行一种ar脚本,这种脚本的资料非常少,在man ar中都没有介绍。我们接下来就使用这种脚本来将一个静态库添加到另一个静态库中。


CREATE libstatic.a
SAVE
END

这个脚本的作用是创建一个空的名为libstatic.a的库,以上脚本保存为ar.mac
执行ar -M < ar.mac,可以看到这里是使用了重定向输入来执行脚本的。


ar -q libstatic.a s1.o
ar -q libstatic.a s2.o
ar -q libstatic.a s3.o

然后在shell中执行上面的命令,将静态库自己的.o文件添加到库中。


OPEN libstatic.a
ADDLIB libstatic123.a
SAVE
END

这个脚本的作用是打开库文件然后添加另一个依赖库文件。
将脚本保存后同样使用ar -M执行。

这样就完成了将一个库添加到另一个库中,此时可以使用ar -t命令查看一下库里面的内容,可以看到依赖库的.o文件都被包含进去了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

静态库.a的生成,及生成一个依赖另一个库存在的静态库

今天就来说说.a的制作吧,刚开始做ios开发的时候看见大神把核心代码什么的封成.a就觉得这是手绝活,这几天亲手弄了一下,也就那回事吧 - -! 应主管要求做个静态库,不过这个静态库是建立在三方静态库...
  • u014773226
  • u014773226
  • 2015年05月13日 22:59
  • 2089

gcc链接静态库时对待.a文件和.o文件的不同

很多人都知道,gcc在链接静态库时是从前往后找符号。因此如果一份文件foo引用了静态库bar.a,那么在链接命令中,bar.a必须放在foo的后面,也就是像gcc ... foo ... bar.a这...
  • zzxiang1985
  • zzxiang1985
  • 2015年02月11日 12:16
  • 8721

gcc静态库相互依赖找不到符号问题

gcc静态库链接的问题  有两个静态库liblua.a和libluaexport.a。其中libluaexport.a依赖于liblua.a。 链接时,必须按顺序写成 -lluaexp...
  • love_hot_girl
  • love_hot_girl
  • 2013年11月04日 16:38
  • 1474

linux 编译 依赖静态库的静态库问题

前言---------------------------------- 最近工作中遇到一个linux编译问题,其实是小问题,但经验不足,弄了2天,特做记录。 背景------------...
  • dxpqxb
  • dxpqxb
  • 2017年09月29日 11:45
  • 146

静态链接库相互依赖

想同时链接两个自定义的静态链接库,发现无论以什么顺序链接都会有一些函数未定义。网上搜了一番找到解决方案: 假设有liba.a和libb.a两个静态链接库,则添加链接选项时,多链接其中一个库一遍即可解...
  • hodd1988
  • hodd1988
  • 2014年02月24日 20:58
  • 1727

再议GCC编译时的静态库依赖次顺问题

假设有如三个源代码文件: $ cat a.cpp void a() { }   $ cat b.cpp extern void a(); void b() {     a(); // 调用a....
  • Aquester
  • Aquester
  • 2015年09月18日 15:48
  • 2349

Linux下gcc生成和使用静态库和动态库详解

Linux下gcc生成和使用静态库和动态库详解(原文链接) 本文在原文的基础上做一些详细验证,部分稍有改动, 一、基本概念 1.1什么是库 1.2库的种类 1.3库存在的意义 1.4库文件是如何...
  • CSqingchen
  • CSqingchen
  • 2016年05月31日 17:54
  • 5753

libcurl在linux下编译好的静态库 支持ssl

  • 2017年10月12日 14:36
  • 649KB
  • 下载

Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f

本文是转载,原文是:http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520101023104745738/ 一、基本概念 1....
  • csq_year
  • csq_year
  • 2015年08月18日 15:38
  • 3809

linux下静态库的依赖顺序

贴下结论: LD在链接生成目标文件时, 会从左到有扫描输入的依赖库, 但是, 当依赖库之间也有依赖关系时,必须将”依赖别人的库”放在 “被别人依赖的库”的前面. 否则,会链接失败!...
  • ken_scott
  • ken_scott
  • 2014年04月28日 17:08
  • 935
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux下的静态库依赖
举报原因:
原因补充:

(最多只允许输入30个字)