linux 静态库使用经验
在编写程序的过程中,对于一些接口往往抽象成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 静态库使用经验的更多相关文章
- linux静态库的生成与使用(转)
linux静态库的生成与使用(转) 库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linu ...
- Linux静态库生成指南
Linux静态库生成指南 Linux上的静态库,其实是目标文件的归档文件.在Linux上创建静态库的步骤如下: 写源文件,通过 gcc -c xxx.c 生成目标文件. 用 ar 归档目标文件,生 ...
- Linux 静态库(.a)转换为动态库(.so)
Linux 静态库转换为动态库 参考 http://blog.csdn.net/moxuansheng/article/details/5812410 首先将.a文件转为.so文件是可以实现的 原因是 ...
- 关于Linux静态库和动态库的分析
关于Linux静态库和动态库的分析 关于Linux静态库和动态库的分析 1.什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可运行代码的二进制形式.能够被操作系统加 ...
- Linux静态库和共享库
1.什么是静态库静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Windows动态链接库DLL 特点:包含函数代码声明和实现,链接后所有代码都嵌入到宿主程序中. 只在 ...
- Linux静态库和动态库
Linux 工具 ❑ GCC: The GNU Compiler Collection, containing the GNU C compiler❑ G++: A C++ compiler, inc ...
- Linux 静态库与动态库搜索路径设置详解【转】
原文地址:http://blog.chinaunix.net/uid-29025972-id-3855495.html 1. 连接和运行时库文件搜索路径的设置 库文件在连接(静态库和共享库)和运行(仅 ...
- Linux 静态库和动态库 使用说明
Linux下程序运行中,有两种库,静态库和动态库. 静态库:名字一般为libxxx.a,编译时会整合到可执行程序中,优点是运行时不需要外部函数库支持,缺点是编译后程序较大,一旦静态库改 ...
- 详细讲解 关于Linux静态库和动态库的分析
基本概念 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: ...
随机推荐
- 在vue中使用Element-UI
Element-UI是一套基于Vue2.0的UI组件库,http://element.eleme.io/#/zh-CN/component/carousel 首先npm install element ...
- [AGC008F] Black Radius(树形dp)
神题啊!! Description 给你一棵有N个节点的树,节点编号为1到N,所有边的长度都为1 "全"对某些节点情有独钟,这些他喜欢的节点的信息会以一个长度为N的字符串s的形式给 ...
- POJ3983 快算24
很正常的题目,迷一样的答案. 测试数据只有一组,对没错只有一组. #include<cstdio> int main() { printf("5*(5-(1/5))\n" ...
- Request.Form to JSON
原文发布时间为:2012-03-21 -- 来源于本人的百度文章 [由搬家工具导入] NameValueCollection nvc =newNameValueCollection(Request.F ...
- jQuery 拖动排序
原文发布时间为:2010-04-11 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html><html lang="en">< ...
- 学习 表单验证插件validate
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- unittest框架及自动化测试
之前在公司做过自动化测试的知识分享,现在把它记录下来. •一.如何更好的编写测试用例 •1.模块化:将一些基础的.共有的步骤代码独立为单独的模块,使用时再调用.好处:可以使代码复用,减少代码编写, ...
- git tag 的使用
// 查看tag,列出所有tag,列出的tag是按字母排序的,和创建时间没关系. $ git tag v0.1 v1.3 /查看指定版本的tag,git tag -l “v1.4.2.**” $ gi ...
- Codeforces Gym100814 I.Salem-异或 (ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology)
这个题就是二进制,找两个数相应的二进制相对应的位置上数不同的最多的个数.异或写就可以. 一开始还想麻烦了,找出来最大的偶数和最大的奇数,最小的偶数和最小的奇数,但是这样想考虑的不全.因为范围比较小,直 ...
- Codeforces Gym100971 C.Triangles-组三角形 (IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13)
这个题就是组三角形,从给出的数组里任选两个和未知的边组三角形. 任意两边之和大于第三边,记住这个就可以了. 代码: 1 #include<cstdio> 2 #include<cst ...