Linux学习笔记7——linux中的静态库和动态库
一、静态库的编译
静态库的编译过程如下:
1、编译成目标文件
这里有一个可选项-static,调用格式:gcc -c -static 代码文件名.c
2、归档成静态库
A、归档的工具是ar工具,使用ar -r可以将文件归档成静态库,调用格式:ar -r 静态库文件 被归档的文件
例如:我们这有两个C文件,分别为test1.c和test2.c
首先我们将它编译成目标文件:gcc -c -static test1.c
gcc -c -static test2.c
此时会产生两个文件,分别为test1.o和test2.o
然后我们将它们归档:ar -r libdemo1.a test1.o test2.o,此时的静态库文件就是demo1.a。注意demo1是库名,前面加上lib是命名规范。
B、使用nm工具可以查看已有函数符号表,使用格式为:nm 静态库或者动态库或者目标文件或者执行文件
3、使用静态库
使用格式:gcc 代码文件名.c l静态库名 -L库所在目录
例如:这里有一个main.c文件和上面的libdemo1.a静态库,现在我们想编译它,则:
gcc main.c -omain -ldemo1 -L.
4、静态库的规范和约定
库命名规则:lib库名.a //此处是指在lib后面直接加上库名,如上例中的libdemo1.a
库使用规则:-l库名 //此处是指在-l后面直接加上库名
-L库所在目录 //此处是指在-L后面直接加上库所在目录,如在当前目录,就是-L.
5、采用库的方式管理代码优点:容易组织代码、复用、保护代码版权
6、静态库的静态的含义:编译好的程序运行的时候不依赖库,库作为程序的一部分编译连接。
7、静态库本质:就是目标文件集合(归档)
二、动态库的编译(Linux中称为共享库)
1、动态库和静态库的区别
A、动态库是可以执行,静态库不能执行。
B、动态库不会成为程序的一部分,而静态库在程序的链接阶段被复制到了程序中
2、动态库的编译
使用-c -fpic,其中-fpic可选
3、动态库的连接
使用-shared
例如:有两个C文件,分别为test3.c,test4.c
分别对他们进行编译:gcc -c -fpic test3.c
gcc -c -fpic test4.c
产生test3.o和test4.o,然后对他们连接:gcc -shared -olibdemo2.so test3.o test4.o
4、使用动态库
使用格式:gcc 代码 -l库名 -L动态库所在路径
例如:有一个代码文件main2.c,要使用上面产生的动态库demo2,则:
gcc main2.c -ldemo2 -L. -omain
5、动态库的命名规则
lib库名.so
6、动态库的加载
A.找到动态库
B.加载动态库到内存
C.映射到用户的内存空间
7、系统对动态库查找规则
A、在/lib中查找
B、在/usr/lib中查找
C、到环境变量LD_LIBRARY_PATH指定的路径中查找
8、动态库的使用工具
ldd 察看程序需要调用的动态库,当然,ldd只能查看可执行文件
readelf -h 查看执行程序头.
Linux学习笔记7——linux中的静态库和动态库的更多相关文章
- linux学习笔记2 - linux常用命令
转载请标注原链接:http://www.cnblogs.com/xczyd/p/5543731.html 第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装lin ...
- Linux学习笔记之Linux启动引导过程
早期时,启动一台计算机意味着要给计算机喂一条包含引导程序的纸带,或者手工使用前端面板地址/数据/控制开关来加载引导程序.尽管目前的计算机已经装备了很多工具来简化引导过程,但是这一切并没有对整个过程进行 ...
- Linux学习笔记之Linux相关知识
[想成为某一方面的大神,没有捷径可走,只能不断的记录.练习.总结.coding……] notes:主要从网上摘录了一些关于Linux的历史以及一些相关内容,以便对Linux系统有一定的了解.这不但可以 ...
- Linux学习笔记之Linux第一课-基本介绍
Linux简介 Linux内核最初只是由芬兰人李纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的. Linux是一套免费使用和自由传播的类Unix操作系统,是一个基 ...
- Android(java)学习笔记173:BroadcastReceiver之 静态注册 和 动态注册
1. 广播接受者>什么是广播.收音机.电台:对外发送信号.收音机:接收电台的信号. >在android系统里面,系统有很多重要的事件: 电池电量低,插入充电器,sd卡被移除,有电话打出去, ...
- Android(java)学习笔记116:BroadcastReceiver之 静态注册 和 动态注册
1. 广播接受者>什么是广播.收音机.电台:对外发送信号.收音机:接收电台的信号. >在android系统里面,系统有很多重要的事件: 电池电量低,插入充电器,sd卡被移除,有电话打出去, ...
- Linux学习笔记1-在CentOS 7中安装配置JDK8
说明: 参考博客:http://blog.csdn.net/czmchen/article/details/41047187系统环境:CentOS 7安装方式:rpm安装JDK地址:http://ww ...
- Linux学习笔记:ftp中binary二进制与ascii传输模式的区别
在使用ftp传输文件时,常添加上一句: binary -- 使用二进制模式传输文件 遂查资料,如下所获. FTP可用多种格式传输文件,通常由系统决定,大多数Linux/UNIX系统只有两种模式:文本 ...
- Linux学习笔记12——Unix中的进程
通过调用fork和exec函数都能创建新的进程,但两者有着本质的区别:fork函数拷贝了父进程的内存映像,而exec函数用用新的映像来覆盖调用进程的进程映像的功能. 一 fork函数 #includ ...
随机推荐
- [功能帮助类] C#取汉字拼音的首字母PinYin帮助类 (转载)
点击下载 PinYin.rar 主要功能就是取汉字拼音的首字母,只要你输入一个汉字,或者是多个汉字就会取出相应的道字母,主要是方便查询使用的 /// <summary> /// 编 码 人 ...
- Synchronized vs SyncRoot
我们知道,在.net的一些集合类型中,譬如Hashtable和ArrayList,都有Synchronized静态方法和SyncRoot实例方法,他们之间有联系吗?我怎么才能用好他们呢?我们以Hash ...
- .NET多线程同步方法详解
.NET多线程同步方法详解(一):自由锁(InterLocked) .NET多线程同步方法详解(二):互斥锁(lock) NET多线程同步方法详解(三):读写锁(ReadWriteLock) .NET ...
- jQuery.each的function中有哪些参数(可以大概理解function中的参数问题)
1.没有参数 $("img").each(function(){ $(this).toggleClass("example"); }); 1 2 3 2.有一个 ...
- 跨域的小小总结:js跨域及跨域的几种解决方法
一.什么是跨域?? js跨域请求就是使用js访问iframe里的不同域名下的页面内容,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同的域的iframe框架中的数据.即只要域名.协议. ...
- C#中检查网络是否连通的二种方法
using System; 2 using System.Collections.Generic; 3 using System.Text; 4 //方法一 5 using System.Ru ...
- 生产者与消费者(一)---wait与notify
生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品.解决生产者/消费者问题的方法可分为两类: (1)采用某种机 ...
- 读书笔记之 - javascript 设计模式 - 接口、封装和链式调用
javascript 采用设计模式主要有下面的三方面原因: 可维护性:设计模式有助于降低模块之间的耦合程度.这使代码进行重构和换用不同的模块变得容易,也使程序员在大型项目中合作变得容易. 沟通:设计模 ...
- 站点下的GridView的RowCommand事件的设置,与站点应用不一样
<ItemTemplate> <%--<a ...
- Touch组件实现原理
Touch组件的实现主要解决了在pc端和移动端拖拽元素的功能. PC端: 依靠事件: mousedown,mousemove,mouseup的鼠标事件.过程: 1. mousedown事件中记录当前元 ...