Linux库的概念

库是一种软件组建技术,里面封装了数据和函数,提供给用户程序调用。使用库能够使程序模块化,提高编译速度,实现代码重用,易于升级。

Windows系统提供了大量静态链接库(.lib)和动态链接库(.dll)文件。

在Linux中,库文件放在/usr/lib或/lib文件夹下,Linux库文件名称由前缀lib,库名以及后缀三部分组成,动态库以.so作为后缀,静态库以.a作为后缀。


静态库的特点

静态库的代码在编译时就复制到程序中,多个程序同一时候引用一个静态库函数时,内存中将会有调用函数的多个副本。

静态库节省编译时间,可是导致代码量膨胀。

长处是编译后的运行程序不须要外部函数库支持。可是假设静态函数库改变了。程序须要又一次编译。

静态库的创建和使用

步骤:

  1. 在一个头文件里声明静态库所导出的函数。
  2. 在一个源文件里实现静态库所导出的函数。

  3. 编译源文件,生成可运行代码。
  4. 将可运行代码所在的目标文件增加到某个静态库中,并将静态库复制到系统默认存放库文件的文件夹下。(假设不拷贝则须要用命令行选项指定库文件所在文件夹)

    实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* mylib.h */
#ifndef _MYLIB_H
#define _MYLIB_H
void welcome();
void print_string(const char *str);
#endif
/* mylib.c */
#include "mylib.h"
#include <stdio.h>
void welcome()
{
printf("Welcome to libmylib\n");
}
void print_string(const char *str)
{
if (str != NULL)
printf("%s\n", str);
}

编译mylib.c生成目标文件:

gcc -o mylib.o -c mylib.c

将目标文件增加到静态库中,静态库为libmylib.a

ar rcs libmylib.a mylib.o

rcs命令行是选项,含义请參考man手冊

将静态库复制到Linux的库文件夹/usr/lib或/lib下:

cp libmylib.a /usr/lib/libmylib.a

1
2
3
4
5
6
7
8
9
/* test.c */
#include "mylib.h"
#include <stdio.h>
int main(void)
{
welcome();
print_string("It's successful");
return 0;
}

编译而且运行:

gcc -o test test.c -lmylib

-l为选项,mylib是库名,省略前后缀

./test

假设前面没有复制到Linux的库文件夹,须要指定静态库文件的路径

gcc -o test test.c -L. -lmylib

-L.表示库文件在当前路径。

很多其它ar命令请參考man ar手冊。


动态库的特点

动态库在程序開始执行后调用库函数时才被加载,被调函数在内存中仅仅有一个副本,且能够在程序执行期间释放动态库所占的内存。

眼下Linux中使用动态库居多,由于升级方便。

动态库的创建和使用

把mylib.c创建成动态库的命令:

gcc -fPIC -o mylib.o -c mylib.c

gcc -shared -o mylib.so mylib.o

或者

gcc -fPIC -shared -o mylib.so mylib.c

使用动态库:

gcc -o test test.c ./mylib.so

./test

还有一种方法是通过调用系统函数使用动态链接库,详细參考

void* dlopen(const char *filename, int flag)系列函数。


參考

《Linux C编程实战》,加入部分内容,改动了部分代码。

最新文章

  1. FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS
  2. 深度|OpenAI 首批研究成果聚焦无监督学习,生成模型如何高效的理解世界(附论文)
  3. 处于同一个域中的两台Sql server 实例无法连接
  4. xml中俩种解析方式
  5. 用DataBaseMail发图片并茂的邮件
  6. 祭奠我的csdn博客
  7. PureMVC(JS版)源码解析(四):Notifier类
  8. jumpserver 堡垒机环境搭建(图文详解)
  9. elasticsearch系列(一) 术语
  10. 最大流算法之ISAP
  11. DNS生效时间
  12. 使用shell快速建立上万个文件夹
  13. dom4j,json,pattern性能对比【原】
  14. (后台)El表达式格式化两位小数
  15. django模板语言之Template
  16. RCNN 目标识别基本原理
  17. Innodb独立的undo tablespace
  18. Android--------------BroadcastReceiver的学习
  19. wifidog 源码初分析(3)-转
  20. 实验三 敏捷开发和XP实验

热门文章

  1. javascript中的lambda表达式
  2. CentOS 7下配置安装KVM
  3. 亚马逊API的使用
  4. 知识共享 - creative commons
  5. Oracle 12c on Solaris 10 安装文档
  6. 获取WINDOWS打印机列表
  7. C#编程(八)--------- Main函数
  8. 聊聊并发(四)——深入分析ConcurrentHashMap
  9. 泛泰A870(高通600 cpu 720p) 刷4.4专用中文recovery TWRP2.7.1.1版(三版通刷)
  10. [9] 圆环(Ring)图形的生成算法