Linux库的创建和使用

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编程实战》,添加部分内容,修改了部分代码。