一、静态库的编译

  静态库的编译过程如下:

  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中的静态库和动态库的更多相关文章

  1. linux学习笔记2 - linux常用命令

    转载请标注原链接:http://www.cnblogs.com/xczyd/p/5543731.html 第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装lin ...

  2. Linux学习笔记之Linux启动引导过程

    早期时,启动一台计算机意味着要给计算机喂一条包含引导程序的纸带,或者手工使用前端面板地址/数据/控制开关来加载引导程序.尽管目前的计算机已经装备了很多工具来简化引导过程,但是这一切并没有对整个过程进行 ...

  3. Linux学习笔记之Linux相关知识

    [想成为某一方面的大神,没有捷径可走,只能不断的记录.练习.总结.coding……] notes:主要从网上摘录了一些关于Linux的历史以及一些相关内容,以便对Linux系统有一定的了解.这不但可以 ...

  4. Linux学习笔记之Linux第一课-基本介绍

    Linux简介 Linux内核最初只是由芬兰人李纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的. Linux是一套免费使用和自由传播的类Unix操作系统,是一个基 ...

  5. Android(java)学习笔记173:BroadcastReceiver之 静态注册 和 动态注册

    1. 广播接受者>什么是广播.收音机.电台:对外发送信号.收音机:接收电台的信号. >在android系统里面,系统有很多重要的事件: 电池电量低,插入充电器,sd卡被移除,有电话打出去, ...

  6. Android(java)学习笔记116:BroadcastReceiver之 静态注册 和 动态注册

    1. 广播接受者>什么是广播.收音机.电台:对外发送信号.收音机:接收电台的信号. >在android系统里面,系统有很多重要的事件: 电池电量低,插入充电器,sd卡被移除,有电话打出去, ...

  7. Linux学习笔记1-在CentOS 7中安装配置JDK8

    说明: 参考博客:http://blog.csdn.net/czmchen/article/details/41047187系统环境:CentOS 7安装方式:rpm安装JDK地址:http://ww ...

  8. Linux学习笔记:ftp中binary二进制与ascii传输模式的区别

    在使用ftp传输文件时,常添加上一句: binary  -- 使用二进制模式传输文件 遂查资料,如下所获. FTP可用多种格式传输文件,通常由系统决定,大多数Linux/UNIX系统只有两种模式:文本 ...

  9. Linux学习笔记12——Unix中的进程

    通过调用fork和exec函数都能创建新的进程,但两者有着本质的区别:fork函数拷贝了父进程的内存映像,而exec函数用用新的映像来覆盖调用进程的进程映像的功能. 一  fork函数 #includ ...

随机推荐

  1. SQL Server中Id自增列的最大Id是多少

    什么是自增列 在SQL Server中可以将Id列设为自增.即无需为Id指定值,由SQL Server自动给该列赋值,每新增一列Id的值加一,初始值为1. 需要注意的是即使将原先添加的所有数据都删除, ...

  2. 快速消除IOS 版本升级带来的警告

    开发中我们经常会遇到这样的情况,我们在IOS 6.0开发的程序,当出现IOS 7.0 或者IOS8.0的时候,我们代码中得某些方法苹果已经不推荐使用了,建议我们改用新的方法.如果我们不更新方法,则会出 ...

  3. 读懂IL代码(三)

    由于要写毕业论文的缘故,最近比较没有时间写,总是要抽出时间抽出时间.诶,这样的生活比较烦躁. 这一篇主要写委托.类.方法的IL代码,一一来说明. 委托:搞过C#的都应该清楚,委托实际上是一个类.编译器 ...

  4. C++学习笔记-1-自增和自减运算符

    1. post-increment and pre-increment 的区别 来源:http://www.c4learn.com/c-programming/c-increment-operator ...

  5. PC110305/UVA10188

    根据我的规律,每天solved3题就感觉不行了~但是今天好像做水题做上瘾了,不过PC的题目尽管水,水得还是可以让人有进步. 这题OJ自动测评真心坑,题目看起来十分简单,测评返回三种可能: Accept ...

  6. PHP页面静态化入门

    <?php /** *PHP页面静态化分为以下步骤: *1.打开输出控制缓存 *2.返回输出缓存区的内容 *3.将一个字符串写入文件 *4.冲刷出缓存区的内容 */ //1.打开输出控制缓存 o ...

  7. new作为修饰符

    new 修饰符与 new 操作符是两个概念 new 修饰符用于声明类或类的成员,表示隐藏了基类中同名的成员.而new 操作符用于实例化一个类型 new 修饰符只能用于继承类,一般用于弥补基类设计的不足 ...

  8. C# C/S系统软件开发平台架构图(原创)

    企业版V4.0 - 架构图 企业版V4.0 - 桥接功能.后台连接策略 桥接功能是指应用策略模式,由用户配置本地INI文件选择ADO直连(ADO-Direct)或者调用WCF服务接口访问远程服务器后台 ...

  9. 简单学C——第二天

                 控制结构(-) 相信大家对流程图肯定很熟悉.下面我将介绍的正是关于此方面的,c语言中,控制结构大体分为选择结构和循环结构. 一.选择结构:     先贴出一般用于选择结构的语 ...

  10. ASP.NET MVC轻教程 Step By Step 10——模型验证

    在使用表单获取用户输入的数据时,我们必须对数据进行有效性验证,因为来自网络的信息都是不可信的.同时也要给用户即时的反馈,避免让用户感到困惑.这就涉及到数据验证的范畴. 数据验证最直接的做法是在服务器端 ...