Linux下动态库文件名形如 libxxx.so (so 是 Shared Object,既共享的目标文件)。
在链接动态库生成可执行文件时,并不会把动态库的代码复制到可执行文件中,而是在执行文件中记录对动态库的引用。
程序执行时,再去加载动态库文件。如果动态库已经加载,则不必重复加载,从而节省内存空间。
Linux下生成和使用动态库的步骤:
- 编写源文件。
- 将一个或几个源文件编译链接,生成共享库。
- 通过 -L<path> -lxxx 的 gcc选项链接生成libxxx.so。
- 把libxxx.so放入链接库的标准路径,或者运行时指定LD_LIBRARY_PATH, 才能运行链接了libxxx.so的程序。
实例
编写源文件
- 建立一个源文件:max.c
|
- 编译生成共享库:
|
可以得到 libmax.so 。上述过程分为编译和链接两步, -fPIC时编译选项, PIC时Position Independent Code的缩写。
表示要生成与位置无关的代码,这是动态库的特性; -shared 是链接选项,告诉gcc要生成动态库而不是可执行文件。
上述的一行命令等同于:
|
为动态库编写接口文件
让用户知道动态库中有哪些接口可用,需要编写对应的头文件
建立max.h
|
测试,链接动态库生成可执行文件
建立一个使用 max 函数的 test.c , 代码如下
|
生成test, 其中 -lmax 表示要链接 libmax.so。 -L. 表示要链接的库文件包含当前路径。(如果当前目录下有同名的动态库和静态库,gcc优先链接动态库)
|
运行
此时直接运行 ./test 会得到如下错误:找不到libmax.so。
|
因为 Linux 是通过 /etc/ld.so.cache 文件搜寻要链接的动态库。
而 /etc/ld.so.cache 是 ldconfig 程序读取 /etc/ld.so.conf 文件生成的。
此时有两种解决方式:
- 把 libmax.so 所在的路径添加到 /etc/ld.so.conf 中,再以root权限运行 ldconfig 程序,更新 /etc/ld.so.cache。test 运行时,就可以找到 libmax.so。(不推荐这种方式,改动系统的文件)
- 为 test 指定 LD_LIBRARY_PATH。
|