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 ...
随机推荐
- Android 设计随便说说之简单实践(模块划分)
上篇随笔随(Android 设计随便说说)便说了一下什么是设计以及设计的原则,这里举一个简单的例子来进一步的说Android设计.我们以应用商店的设计来举例. 在设计之前,需要把握两部分内容,才能使得 ...
- 清楚form表单数据的便捷jQuery之法
有时候可能需要实现这样的效果:注册表单或者地址表单等填写多个记录之后,想要清除重新填写,如果一个个删除非常麻烦,因此这时清除按钮非常必须.接下来为您详细介绍两个自己经历的便捷方法,需要了解的朋友参考下 ...
- eclipse EE neon创建dynamic web project时,卡在installing dynamic web module facet,解决办法
我们在用eclipse EE neon创建dynamic web project时,如果你发现底部状态栏一直卡在installing dynamic web module facet,永远到不了100 ...
- jquery文本折叠
/** * Created by dongdong on 2015/4/28. */(function($){ var defaults = { height:40, //文本收起后的高度 speed ...
- 使用jquer获取当前时间,并赋值到input上。
今天,做一个项目,需要将自动获取的时间能够赋值到input上.我一开始试用javascript写的,写之后使用很多办法都赋值失败,最后使用了jquery写了出来,下面附上代码. <script ...
- 纯javascript联动的例子
有人想要学习下纯javascript联动的一些技巧,我这里就以日期的联动为例,附上一些代码至于复杂的省市区联动,不建议用纯javascript的,而是用ajax的方式,该不在此讨论范围内,想要了解aj ...
- winform下mapxtreme2008 v7.0 生成release版提示找不到dll问题
在winform下基于mapxtreme2008 v7.0 生成了一个地图软件,用debug方式运行无误,但改为release版时提示缺少一大堆dll,如: 无法从C:\Program Files ( ...
- [转] 小tip: 使用CSS将图片转换成模糊(毛玻璃)效果 ---张鑫旭
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=3804 去年盛夏之时, ...
- 1、Python django 框架下的word Excel TXT Image 等文件的上传
1.文件上传(input标签) (1)html代码(form表单用post方法提交) <input class="btn btn-primary col-md-1" styl ...
- javaScript常用方法整合(项目中用到过的)
防止输入空格.缩进等字符: function trim(str){ return str.replace(/^\s+|\s+$/g,""); } JS去掉style样式标签 fun ...