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#实现从EXCEL文件读取数据到SqlServer数据库
用第三方组件:NPOI组件实现 先去官网:http://npoi.codeplex.com/下载需要引入dll(可以选择.net2.0或者.net4.0的dll),然后在网站中添加引用.使用 NPOI ...
- Redis介绍
Redis的介绍 Remote Dictionary Server(Redis)是一个基于 key-value 键值对的持久化数据库存储系统.支持多种数据结构,包括 string (字符串).list ...
- Java多线程读书笔记之一
今天开始陆续将这几天跟进Java多线程知识的成果记录下来分享. Java多线程的知识是一直想要系统彻底的看完的,但是懒惰加无聊早就了我每天都没有进展,这回下决心一定要把这块知识系统梳理完. 我的知识来 ...
- My97 DatePicker 选择时间后弹出选择的时间
项目中用到这个时间插件,注册用户时可以选中永久和选择时间,二者是互斥关系, 所以在选择时间插件时,需要绑定一个事件,所以看到了这个插件: <input id="yydate" ...
- C# CRC校验的一点感悟
今天在鼓捣一个手持操作器的时候,遇到一点问题,记录一下今天的经验包 由于之前公司产品在校验时基本上都是和校验,今天在准备用C#模拟一个古董操作器的时候,却遇到一个问题,模拟器发出的数据,主板一律不回复 ...
- C字符串总结+字符串库实现(增,改,删,查):
<一>,字符指针&字符数组 两者形式: 字符指针:char *p; 字符数组:char str[100]; 两者区别: 字符指针p是变量: 字符数组str是常量: 访问元素方式: ...
- C++ 静态、动态链接库的简单实现
一.什么是静态链接库,什么是动态链接库? 1.静态链接库就是你使用的.lib文件,库中的代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些.在静态库情况下,函数和数据被编译进 ...
- 设计模式之 State 状态模式
状态模式的核心在于 1. 状态的转换导致行为(Handle)的差异,比如人的状态是饿的时候,吃(Handle)的行为是2个馒头,人状态是不太饿的时候,吃(Handle)的行为是半个馒头 2. Stat ...
- JavaScript 输入自动完成插件
作为web开发的一员,应该都不陌生,信息处理时,很多时候需要根据用户的输入实时反馈查询结果供其选择,这给了用户很好的人机交互体验,在各大门户网站上已经被使用的很成熟了,最近项目中用到此功能,网上有很多 ...
- ecshop安装程序源码阅读-安装脚本(1)
定义系统判断常量 引入安装初始化文件 设置时区 报告所有错误 定义站点根常量 定义php自身相对路径 引入系统,公共函数库 引入并初始化错误处理对象 引入并初始化模板引擎 引入安装相关业务 发送HTT ...