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 ...
随机推荐
- 在.Net框架中 C# 实现多线程的同步方法详解
本文主要描述在C#中线程同步的方法.线程的基本概念网上资料也很多就不再赘述了.直接接入主题,在多线程开发的应用中,线程同步是不可避免的.在.Net框架中,实现线程同步主要通过以下的几种方式来实现,在M ...
- JS 定時刷新父類頁面
function timeCount() { var url = "MAC.aspx"; parent.location.href = url; } function beginC ...
- return、break、continue的区别
一.定义 return:语句用于终止当前方法运行,返回到调用该方法的语句处.如有返回值,则在return后面提供相应的返回值. break:其主要用于循环语句和switch语句,其作用均是强行终止语句 ...
- ACM hdu 1019 Least Common Multiple
Problem Description The least common multiple (LCM) of a set of positive integers is the smallest po ...
- MVVM模式应用 之NotificationObject类
public abstract class NotificationObject : INotifyPropertyChanged { public event PropertyChanged ...
- CSAPP Lab2: Binary Bomb
著名的CSAPP实验:二进制炸弹 就是通过gdb和反汇编猜测程序意图,共有6关和一个隐藏关卡 只有输入正确的字符串才能过关,否则会程序会bomb终止运行 隐藏关卡需要输入特定字符串方会开启 实验材料下 ...
- Win8 +PHP+IIS配置
1.安装IIS:控制面板-程序和功能-打开或关闭Windows功能 2.配置PHP环境 -添加ISAPI筛选: -添加脚本映射:
- c++builder调用vc的dll
$bcb/bin目录中有个implib.exe 把你的vc.dll和implib.exe复制到c盘根目录下 运行cmd 进入c盘根目录执行 c:\implib -a cb.lib vc.dll 会生成 ...
- PHP表单常用正则表达式(URL、HTTP、手机、邮箱等)
<?php /** * @description: 正则表达式匹配 */ class Regex { /** * @手机号 */ public static function Phone($su ...
- adb找不到设备
提示信息如下所示: adb server is out of date.killing... adb server didn't ACK *failed to start daemon * error ...