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 ...
随机推荐
- MES项目中出现的一个事务嵌套的使用场景
昨天在MES项目中,需要在业务逻辑的几个关键点记录错误信息,需要把错误信息写入数据表. 但是由于整个业务逻辑都是包在一个事务模板里面的 比如这样的: WhhTransactionTemplate tr ...
- ASP.NET 相关小知识
后台修改前台html控件属性 添加 runat=server ,后台获取// 客户端隐藏 a.Attributes[ "style "] = "display:none ...
- CodeSmith中SchemaExplorer属性的介绍
CodeSmith与数据库的联系,在CodeSmith中自带一个程序集SchemaExplorer.dll,这个程序集中的类主要用于获取数据库中各种对象的结构. <%@ Property Nam ...
- double 类型运算会出现精度问题
要先转换为字符串,后进行运算,可以写个方法做乘法运算public static double mul(double v1,double v2){BigDecimal b1 = new BigDecim ...
- iOS RegexKitLite的使用以及常用的正则表达式
1.去RegexKitLite下载类库,解压出来会有一个例子包及2个文件,其实用到的就这2个文件,添加到工程中. 2.工程中添加libicucore.dylib frameworks. 3.现在所有的 ...
- iOS8 iPad Warning: Attempt to present <UIImagePickerController:xxxx > on xxxx which is already presenting (null)
解决方法: /* I think this is because in iOS 8, alert views and action sheets are actually presented view ...
- 数组转换成json
下面是详细的步骤,也可参考http://blog.csdn.net/wangliqiang1014/article/details/19924727 iOS数组可以转换车json对象,转换代码:NSS ...
- c语言中文件相关操作
一 .首先介绍一下数据文件的类型: 1.二进制文件(映像文件):在内存中以二进制形式存取. 2.文本文件(ascii文件):以ascii码形式存取的文件. 通俗的讲,在Mac下,你把一个文件丢进记事本 ...
- MVC权限模块
设计方向: 1.摒弃SiteMap,避免在容易书写错误的sitemap中书写,导航在controller和action上打标签生成. 2.controller统一继承basecontroller,在b ...
- ThinkPHP调试模式与日志记录
1.可以在config.php中进行设置,默认为关闭状态. 'APP_DEBUG' => true 打开\ThinkPHP\Common\debug.php文件可以查看debug的默认设置 ...