在编写程序的过程中,对于一些接口往往抽象成lib库的形式,甚至有些程序只有一个主程序,其他接口的调用都是库的形式存在。较多的使用库会比较利于程序的维护,因为我们的程序都可以被其他的人使用,但是往往库的存在会增加一些编译上的问题。

在linux中有静态库和动态库两种,两者各有优劣,对于后端伺服的服务器来说,我们更倾向于静态库,因为它部署方便,效率更高,而后端的服务器并不在意那些静态库多占用的内存。

对于静态库我们要先理解其原理,静态库是一些目标文件的集合,通常为后缀为.o的文件,通过ar命令打包而成,一般命名的格式为libXXX.a。在用户创建可执行程序的过程中,同-L指定静态库的地址,通过-lxxx指定静态库的名称,完成静态库到主程序的链接。静态库只在程序链接的时候起作用,最终的程序脱离静态库运行。对于静态库我们有下面的理解:

1)             静态库的生成过程是一个编译的过程,即只要.o文件生成了,就可以生成静态库。如果.o文件中依赖了其他静态库或者动态库,在编译静态库的时候不需要指定;

2)             鉴于1)在可执行程序编译使用静态库的时候,必须自己指定静态库依赖的其他库,否则链接的时候会报错,找不到一些函数。(这个地方不合理,静态库的产生者才更清楚它依赖哪些库,现在反到要使用者关心?)

3)             编译依赖库的依赖关系,越基础依赖的在后面,比如liba.a依赖libb.a,则在gcc中应该先 -la 再-lb。可以通过xlinker参数来控制不考虑库的访问顺序:-Xlinker "-(" –L ./lib –la –b  -Xlinker "-)", 链接器在处理”-(”和”-)”之间的静态库时,会重复查找这些静态库,从而解决了静态库的查找顺序问题。这种方式比人工提供链接顺序的方式效率会低很多,但是在较大的项目里面,我们仍然建议使用这个参数。

4)             如果一个可执行程序需要依赖几个静态库,而这些静态库的一些头文件声明了相同的函数,链接的时候会产生冲突报错,即使你的可执行程序即没有使用这些函数也没有引用它们的头文件。一个解决的办法就是使用命名空间。

5)             既有动态也有静态的同名库的时候,优先调用的是动态库;如果是只是使用静态库可以通过参数–Bstatic 指定,它等价于-dn、-non_shared、-static。

linux 静态库使用经验的更多相关文章

  1. linux静态库的生成与使用(转)

    linux静态库的生成与使用(转) 库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linu ...

  2. Linux静态库生成指南

    Linux静态库生成指南   Linux上的静态库,其实是目标文件的归档文件.在Linux上创建静态库的步骤如下: 写源文件,通过 gcc -c xxx.c 生成目标文件. 用 ar 归档目标文件,生 ...

  3. Linux 静态库(.a)转换为动态库(.so)

    Linux 静态库转换为动态库 参考 http://blog.csdn.net/moxuansheng/article/details/5812410 首先将.a文件转为.so文件是可以实现的 原因是 ...

  4. 关于Linux静态库和动态库的分析

    关于Linux静态库和动态库的分析 关于Linux静态库和动态库的分析 1.什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可运行代码的二进制形式.能够被操作系统加 ...

  5. Linux静态库和共享库

    1.什么是静态库静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Windows动态链接库DLL 特点:包含函数代码声明和实现,链接后所有代码都嵌入到宿主程序中. 只在 ...

  6. Linux静态库和动态库

    Linux 工具 ❑ GCC: The GNU Compiler Collection, containing the GNU C compiler❑ G++: A C++ compiler, inc ...

  7. Linux 静态库与动态库搜索路径设置详解【转】

    原文地址:http://blog.chinaunix.net/uid-29025972-id-3855495.html 1. 连接和运行时库文件搜索路径的设置 库文件在连接(静态库和共享库)和运行(仅 ...

  8. Linux 静态库和动态库 使用说明

        Linux下程序运行中,有两种库,静态库和动态库.     静态库:名字一般为libxxx.a,编译时会整合到可执行程序中,优点是运行时不需要外部函数库支持,缺点是编译后程序较大,一旦静态库改 ...

  9. 详细讲解 关于Linux静态库和动态库的分析

    基本概念 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: ...

随机推荐

  1. shell 条件表达式

    1.条件测试的常用语法如下 1.test 测试表达式 2.[ 测试表达式 ] #两边需要有空格 3.[[ 测试表达式 ]] 4.(( 测试表达式 )) 说明: 第一种和第二种是等价的,第三种是扩展的t ...

  2. UOJ Goodbye Bingshen

    在叶子童鞋的推荐下打了这场比赛... 感觉被虐爆了... 怎么这么多构造题... 我还没写过呢... 交互题是毛线...看了好久没看懂...就放弃了...(我语文好差QAQ...) 最后只会T1... ...

  3. URLRewrite出现的CSS及图片路径问题

    原文发布时间为:2011-02-24 -- 来源于本人的百度文章 [由搬家工具导入] 例如:把http://www.sofunz.com/house/18649重写到http://www.sofunz ...

  4. 图片抓取器web + winform

    原文发布时间为:2009-11-21 -- 来源于本人的百度文章 [由搬家工具导入] 请先学习:http://hi.baidu.com/handboy/blog/item/bfef61000a67ea ...

  5. ubuntu下使用OBS开斗鱼直播

    系统环境:ubuntu 15.10,OBS Studio 0.13.1 OBS是可以在linux,windows,mac下直播的开源软件,官方地址:https://obsproject.com/ 斗鱼 ...

  6. C#图解教程学习笔记——类和继承

    一.屏蔽基类的成员所有类都派生自object类.虽然类只能直接继承一个基类,但继承的层次没有限制.虽然派生类不能删除它继承的任何成员,但可以用与基类同名的成员来屏蔽(mask)基类成员.1. 要屏蔽一 ...

  7. LeetCode OJ-- Surrounded Regions **@

    https://oj.leetcode.com/problems/surrounded-regions/ 棋盘类的题目.找出所有没有被 X 包围的 O 使用深搜,但是太深了,run time erro ...

  8. 如何证明一个数的数根(digital root)就是它对9的余数?

    数根就是不断地求这个数的各位数之和,直到求到个位数为止.所以数根一定和该数模9同余,但是数根又是大于零小于10的,所以数根模9的余数就是它本身,也就是说该数模9之后余数就是数根. 证明: 假设有一个n ...

  9. shell高级-----创建函数

    基本脚本函数 1.创建函数 有两种格式可以用来在bash shell脚本中创建函数.第一种采用关键字function.后跟分配给该代码的函数名. function name { commands } ...

  10. TensorFlow——共享变量的使用方法

    1.共享变量用途 在构建模型时,需要使用tf.Variable来创建一个变量(也可以理解成节点).当两个模型一起训练时,一个模型需要使用其他模型创建的变量,比如,对抗网络中的生成器和判别器.如果使用t ...