C语言静态链接库和动态链接库讲解及制作使用

1. 引言

静态链接库和动态库均为函数库

函数库:不是C语言的一部分,是一些事先写好的函数的集合,给别人复用
就像scanf和printf函数一样,通过#include <stdio.h>,即可调用
早期并没有函数库,只是后来的程序员们通过整理把日常用的函数进行合并,形成一份完整的函数库,就是现在的标准函数库,例如:glibc

静态链接库:

  • 函数库源代码经过只编译不链接形成的.o目标文件,然后通过ar工具将.o文件归档成.a静态链接库文件
  • 商业公司通过发布.h头文件和.a静态链接库文件给用户使用
  • 用户拿到.a和.h文件,通过.h文件得知函数库内的函数原型,然后在自己的.c文件中直接调用这些库函数
  • 在链接形成可执行程序过程中:链接器会在.a文件中找到对应的.o文件
  • 缺点:如果多个应用程序都使用了同一个静态库的库函数时,则会导致每个应用程序在生成可执行程序中,都各自复制了一份库函数的代码,这些应用程序如果同时运行,在系统内存中则会存在多个库函数的副本,很浪费内存

动态链接库(.so Shared Object共享库)

  • 优点:不像静态链接库那样,拷贝库函数的代码到可执行程序中,而是在可执行程序需要调用到库函数的位置做了标记,当可执行程序运行到调用该库函数的位置,会自动将该动态库加载到内存,以后不管多少个应用程序同时运行,该库函数在内存中只有一份

2. 制作静态链接库

  • mylib.c
#include <stdio.h>
int Max(int a, int b)
{return (a > b) ? a : b;
}void PrintMaxNumber(int a, int b)
{printf("The max is %d.\n", Max(a, b));
}
  • mylib.h
int Max(int a, int b);void PrintMaxNumber(int a, int b);
  • 将 mylib.c 编译为 mylib.o 目标文件
gcc -c mylib.c -o mylib.o
  • 使用 ar 工具,将 mylib.o 目标文件打包为 libmylib.a 静态链接库文件
ar -rc libmylib.a mylib.o

3. 使用静态链接库

  • test.c
#include <stdio.h>
#include "mylib.h"int main()
{int a = 5;int b = 3;int max = Max(a, b);printf("The max number is %d.\n", max);PrintMaxNumber(a, b);return 0;
}
  • 将 test.c 编译链接为可执行程序
gcc test.c -o test -lmylib -L.
  • 运行 test 可执行程序,查看结果
mrs@mrs-virtual-machine:~/Desktop$ ./test
The max number is 5.
The max is 5.

4. 制作动态链接库

  • 编译链接生成 mylib.o
gcc -c mylib.c -o mylib.o -fPIC
  • 将 mylib.o 打包生成 libmylib.so 动态链接库文件
gcc -o libmylib.so mylib.o -shared
  • 将 /Desktop 目录(因为我的libmylib.so就是在这个目录)加入到 LD_LIBRARY_PATH 动态链接库路径下
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/Desktop

5. 使用动态链接库

  • 将 test.c 编译链接为 test 可执行程序
gcc test.c -o test -lmylib -L.
  • 运行 test 可执行程序,得到运行结果
mrs@mrs-virtual-machine:~/Desktop$ ./test
The max number is 5.
The max is 5.

附录

功能 命令
nm libmylib.a 查看当前 .a 文件内都有哪些符号(函数名)
-lxxx 该命令为GCC编译链接的参数,指定链接时用到哪些函数库,xxx表示函数库的名称
ldd test 查看可执行程序 test 使用到哪些共享库,以及这些共享库是否能被加载解析

C语言静态链接库和动态链接库讲解及制作使用相关推荐

  1. Linux环境下c语言静态链接库和动态链接库创建和使用

    库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 面对比一下两者: 静态链接库:当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功, ...

  2. c语言库文件是dll还是lib,C语言之静态链接库与动态链接库(2)

    我们发现,无论是静态链接库还是动态链接库,最后都有lib文件,那么两者区别是什么呢? 其实,两个是完全不一样的东西.静态库对应的lib文件叫静态库,动态库对应的lib文件叫导入库.实际上静态库本身就包 ...

  3. cnsl是什么意思_VS2010下创建静态链接库和动态链接库

    VS2010下创建静态链接库和动态链接库 类封装成dll如果你的工作长期与某个领域相关,比如说长期做直接体绘制 (DVR)方面的开发,那么你可能经常使用自己的传递函数类,如果每一个工程你都把传递函数类 ...

  4. C++ 创建静态链接库和动态链接库

    上篇文章演示了如何使用C++ 编译的静态链接库和动态链接库,本篇文章主要介绍如何创建静态链接库和动态链接库,本文使用的工具是visual studio 2019 企业版,需要安装对应的C++sdk,可 ...

  5. 静态链接库与动态链接库区别

    一.        静态链接库与动态链接库区别 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了.但是若使 ...

  6. 静态链接库与动态链接库详解

    以下内容源于C语言中文网相关内容的学习整理,如有侵权请告知删除. 一.库文件的简介 库文件,其等价为压缩包文件.该文件内部通常包含不止一个目标文件(也就是二进制文件),每个目标文件存储的代码,并非完整 ...

  7. 静态链接库、动态链接库使用方法

    总结一下动态链接库和静态链接库.1 首先搞清楚几个概念: 静态库:函数和数据被编译进一个二进制文件,通常扩展名为.lib.在使用静态库的情况下,在编译连接可执行文件时,链接器从库中复制这些函数和数据并 ...

  8. 静态链接库,动态链接库【滴水逆向三期48笔记】

    在开发过程中,我们通常会有很多函数,需要多次使用或在不同的程序中使用该函数,也有可能我们会将我们写好的函数给别人使用,但是我们又不想给他源代码,毕竟代码是我们花了很多功夫写出来的,那么我们如何不发给其 ...

  9. 静态链接库与动态链接库 (二)动态链接库的编译与使用

    上一篇文章里大概描述linux下静态链接库的编译与使用,下面讲动态链接库的编译与使用方法. 1. 什么是动态链接库 所谓动态链接库,是指编译的时候不会把程序引用到的库插入到执行程序里,而是在执行时候才 ...

最新文章

  1. Windows8 开发者预览版发布(微软官方原版)
  2. c# 字典按ascii 排序_sort命令-将文件进行排序并输出
  3. 快慢指针____函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移
  4. android中内存泄露,Android中的内存泄露
  5. Python笔记 【无序】 【一】
  6. 在R中调用关联规则——Apriori算法
  7. 物理路径与虚拟路径 及Web Server
  8. LeaRun敏捷开发框架快速设计表单
  9. Carthagecocopads 摘抄笔记
  10. C语言实现乘法原理,伽罗华乘法原理与C语言实现
  11. 使用python脚本和crontab在阿里云实现优矿自动签到
  12. Android开源项目学习 | QKSMS短信app
  13. Netty 警告 The pipeline contains no upstream handlers; discarding:
  14. 如何把数据导入数据库
  15. OLED屏幕笔记本 | 看久了眼睛不舒服 | 调整
  16. 3_5.网络文件系统
  17. 股票查询小程序_以龙虎榜数据为例
  18. 电销外呼系统主要有哪些作用?
  19. 利用MsChart控件绘制多曲线图表 z
  20. 表单校验之@NotBlank,@NotNull,@NotEmpty之间的区别

热门文章

  1. 遥感学习笔记(一)——太阳辐射与大气作用
  2. Collapsing margins(外边距合并)
  3. 关于新年发红包的小探讨
  4. 用Python写个开心消消乐小游戏
  5. 老师利用计算机分析学生成绩属于什么,倾向分数方法应用:中学生课堂计算机使用对其数学成绩的影响...
  6. ReentrantLock之公平锁和非公平锁详解
  7. 数字取证在打击和预防网络犯罪中的作用
  8. 致敬五四精神 十大“新青年志愿者之星”出炉
  9. 企业10大管理流程图,数字化转型从业者必备!
  10. php运算符取整_php运算符 php取整函数