在Linux操作系统下,动态库(Dynamic Libraries)是一种在程序运行时被加载的共享库,它允许程序在多个进程之间共享代码和数据,从而减少内存占用和提高执行效率。动态库的文件通常以.so
(Shared Object)为扩展名。
动态库:在程序运行时才加载到内存中的库,可以被多个程序共享。
静态库:在编译时就已经链接到程序中的库,每个使用它的程序都会有库的一个副本。
.so
文件。-fPIC
编译选项生成。假设我们有一个简单的C语言函数,存放在mylib.c
文件中:
// mylib.c
int add(int a, int b) {
return a + b;
}
首先,需要编译这个源文件生成位置无关的目标文件:
gcc -c -fPIC mylib.c -o mylib.o
然后,将目标文件打包成动态库:
gcc -shared mylib.o -o libmylib.so
创建一个使用这个动态库的应用程序main.c
:
// main.c
#include <stdio.h>
extern int add(int a, int b);
int main() {
int result = add(3, 4);
printf("The result is %d\n", result);
return 0;
}
编译应用程序时,需要指定链接动态库:
gcc main.c -L. -lmylib -o myapp
这里-L.
告诉编译器在当前目录下查找库文件,-lmylib
指定链接的库名(去掉前缀lib
和后缀.so
)。
运行程序时,操作系统需要知道在哪里找到动态库。可以通过以下几种方式之一来实现:
LD_LIBRARY_PATH
环境变量:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
./myapp
/etc/ld.so.conf
文件:添加动态库的路径,然后运行ldconfig
命令。dlopen
等函数动态加载库。问题:运行程序时提示找不到动态库。
原因:操作系统无法在默认路径或指定的LD_LIBRARY_PATH
中找到动态库。
解决方法:
ldd
命令检查程序依赖的库是否都存在:ldd myapp
LD_LIBRARY_PATH
或在程序启动脚本中添加路径。以上面的mylib.c
和main.c
为例,完整的编译和运行步骤如下:
# 编译动态库
gcc -c -fPIC mylib.c -o mylib.o
gcc -shared mylib.o -o libmylib.so
# 编译应用程序
gcc main.c -L. -lmylib -o myapp
# 运行程序(设置LD_LIBRARY_PATH)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
./myapp
通过以上步骤,你可以在Linux系统下成功创建和使用动态库。
领取专属 10元无门槛券
手把手带您无忧上云