库中实际上就是已编译好的函数代码,可以被程序直接调用。

Linux下的库一般的位置在/lib或者/usr/lib中

静态库

静态库是复制拷贝到调用函数中的,函数运行的时候不再需要静态库,因为静态库是在链接的时候加进去的,所以当函数运行的时候,源库的改变对运行中的函数造成不影响。随之而来,当静态库升级之后,每一个调用静态库的程序都需要重新编译。

特点:

  • 链接静态库的时候,会把库中的相关代码拷贝到可执行文件中
  • 程序运行时不再需要静态库
  • 程序运行时不需加载库,运行速度快
  • 因为库中相关代码是拷贝到可执行文件中,所以占用了更多的磁盘和内存空间
  • 静态库升级之后需要重新编译链接

1.制作库的代码框架:

vim static_test.c
gcc -c static_test.c -Wall #生成 .o 文件
ar crs libstatic_test.a static_test.o #静态库名字就是 static_test.a
#注意: libxxx.a 是创建静态库的格式 其中 xxX.o 就是静态库的名字

还可以用nm libstatic_test.a来查询静态库中的符号信息,也就是函数名称:

2.调用库:

在调用库的函数中要声明调用的函数,不然会报错,然后在编译链接的时候加上静态库:

gcc -o test test.c -L. -lstatic_test
#注意:gcc -o test test.c -L.(-L 是添加库搜索路径,这里库是在当前文件夹的) -l(指定要链接库名字xxx)
#库名是static_test 库文件名是 static_test.a

编译器默认链接C库

3.执行:

通过调用静态库中的Hello函数来输出“Hello World”:

共享库

特点:

  • 共享库在链接的时候,仅仅是记录一下用到了哪个库中的哪个函数,并不复制库中相关代码
  • 多个程序可以同时调用一个共享库
  • 程序在运行的时候来加载共享库
  • 程序体积变小,程序本身没有包含库中的代码
  • 共享库升级之后,无需重新编译程序

1.生成位置无关代码

gcc -c -fPIC share_test.c -Wall

-fPIC表示生产的目标文件是位置无关代码,即可以放在程序的任何地方执行。

2.创建共享库文件

gcc -shared -o libshare_test.so.1 share_test.o

-shared来指定gcc创建一个共享库文件

libshare_test.so.1就是共享库文件名,.so表示是一个共享库文件,共享库文件命名格式为libxxx.so.x最后的x是版本控制,最后面包含的是目标文件,可以是多个目标文件

3.创建链接文件

为了编译器能够找到相应的共享库,需要一个链接文件:

ln -s libshare_test.so.1 libshare_test.so

第一个是目标文件,第二个是符号链接符号,其命名规则是libxxx.so(注意:链接文件没有版本控制)。链接文件相当于一个指针,指向共享库文件。

4.编译并链接共享库

gcc -o test test.c -L. -lshare

-L指定共享库的路径

-lxxx来表示链接文件

当静态库和共享库的链接文件名字一样时,优先使用共享库,但是也可以使用-static来指定静态库。

5.添加共享库的 加载路径

6.如何找到共享库

Linux下库的制作(静态库与共享库)的更多相关文章

  1. Linux下c函数dlopen实现加载动态库so文件代码举例

    dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...

  2. linux下gcc默认搜索的头文件及库文件路径

    转自:https://blog.csdn.net/fd315063004/article/details/7925854 一.头文件 gcc 在编译时如何去寻找所需要的头文件:※所以header fi ...

  3. Egret第三方库的制作和使用(模块化 第三方库)

    一.第三方库的制作 官方教程:第三方库的使用方法 水友帖子:新版本第三方库制作细节5.1.x 首先在任意需要创建第三方库的地方,右键,选择"在此处打开命令窗口" 输入egret c ...

  4. linux下动态连接变为静态打包,使用statifier_S展翅飞_新浪博客

    linux下动态连接变为静态打包,使用statifier_S展翅飞_新浪博客 linux下动态连接变为静态打包,使用statifier (2013-04-27 14:38:19) 转载▼

  5. Linux下Apache服务部署静态网站------网站服务程序

    文章链接(我的CSDN博客): Linux下Apache服务部署静态网站------网站服务程序

  6. Linux下多任务间通信和同步-mmap共享内存

    Linux下多任务间通信和同步-mmap共享内存 嵌入式开发交流群280352802,欢迎加入! 1.简介 共享内存可以说是最有用的进程间通信方式.两个不用的进程共享内存的意思是:同一块物理内存被映射 ...

  7. Linux下script命令录制、回放和共享终端操作script -t 2> timing.log -a output.session # 开始录制

    Linux下script命令录制.回放和共享终端操作 [日期:2018-09-04] 来源:cnblogs.com/f-ck-need-u  作者:骏马金龙 [字体:大 中 小]   另一篇终端会话共 ...

  8. linux下动态链接库.so文件 静态链接库.a文件创建及使用

    转摘网址为:http://www.cnblogs.com/fengyv/archive/2012/08/10/2631313.html Linux下文件的类型是不依赖于其后缀名的,但一般来讲:    ...

  9. Linux下编译、使用静态库和动态库 自己测过的

    每个程序实质上都会链接到一个或者多个的库.比如使用C函数的程序会链接到C运行时库,GUI程序会链接到窗口库等等.无论哪种情况,你都会要决定是链接到静态库(static libary)还是动态库(dyn ...

  10. linux下 GCC编译链接静态库&动态库

    静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 ...

随机推荐

  1. 大数据-Hadoop虚拟机的准备以及配置(三台机子)

    虚拟机的准备 修改静态IP(克隆的虚拟机) vim /etc/udev/rules.d/70-persistent-net.rules 配置网络: Vim /etc/sysconfig/network ...

  2. ESP32-任务看门狗笔记

    看门狗机制用于监控嵌入式系统运行并在发生不可知的软硬件故障时将系统复位.系统正常运行时,看门狗定时器溢出之前会被重置计数值,也就是"喂狗".定时器溢出意味着无法"喂狗&q ...

  3. SQLITE数据库不支持远程访问

    SQLITE数据库不支持远程访问 import sqlite3 conn=sqlite3.connect("dailiaq.db") cur=conn.cursor() def c ...

  4. C语言:\t\b\n应用

    #include <stdio.h> int main() { printf("123\n"); printf("%c\n",'\177'); pr ...

  5. DWA局部路径规划算法论文阅读:The Dynamic Window Approach to Collision Avoidance。

    DWA(动态窗口)算法是用于局部路径规划的算法,已经在ROS中实现,在move_base堆栈中:http://wiki.ros.org/dwa_local_planner DWA算法第一次提出应该是1 ...

  6. 【LeetCode】203.移除链表元素

    203.移除链表元素 知识点:链表:双指针 题目描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 . 示例 ...

  7. 【技巧】使用PPT更换背景色

    主要记述使用PPT来更换图片某一部分的背景色 把想要更改的图片粘贴到PPT里. 依次选择[格式][颜色][设置透明色],然后点击需要更改背景的地方 将自己的目标颜色复制一下,填充上去,选择[置于底层]

  8. SpringBoot之了解自动配置原理

    承接上文: import注解的使用: 作用:引用时,容器自动创建出这填写的类型的组件,默认组件的名字就是全类名. 往容器中添加两个组件 @Import({User.class, DBHelper.cl ...

  9. P4334 [COI2007] Policija

    P4334 [COI2007] Policija 题意 一个无重边的无向图,每次询问删掉一条边或删掉一个点后两个点是否联通. 思路 连通性问题,我们可以考虑使用广义圆方树解决. 对于删掉一个点的情况: ...

  10. 【codeforces1058】Vasya and Golden Ticket 枚举+暴力+模拟

    #点击传送 题目描述 Recently Vasya found a golden ticket - a sequence which consists of nn digits a1a2-ana1a2 ...