Linux环境下C语言调用动态库详解

动态库(Dynamic Link Library,简称DLL),又称为共享库(Shared Library),是一种程序库,可以被多个程序共享使用,在Linux环境下,动态库通常以.so(System Object)为后缀,动态库在程序运行时才会被加载到内存中,相比静态库,它可以减少程序的大小,提高程序的运行效率。
创建动态库
编写源代码
我们需要编写一个C语言源代码文件,该文件包含要实现的功能,以下是一个简单的例子:
#include <stdio.h>
void print_message() {
printf("Hello, dynamic library!\n");
}
编译生成目标文件
使用gcc编译器将源代码编译成目标文件,如下所示:
gcc -c -o hello.o hello.c
创建动态库
使用gcc的-ar工具将目标文件打包成动态库,如下所示:

gcc -shared -fpic -o libhello.so hello.o
-shared表示生成动态库,-fpic表示生成位置无关代码,这样动态库才能被多个程序共享。
在C程序中调用动态库
包含头文件
在C程序中,需要包含动态库的头文件,如下所示:
#include <stdio.h> #include <dlfcn.h>
加载动态库
使用dlopen函数加载动态库,如下所示:
void *handle;
handle = dlopen("libhello.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "Cannot open library: %s\n", dlerror());
exit(EXIT_FAILURE);
}
获取函数指针
使用dlsym函数获取动态库中函数的指针,如下所示:

typedef void (*print_func)(void);
print_func print_message;
print_message = (print_func)dlsym(handle, "print_message");
if (!print_message) {
fprintf(stderr, "Cannot load function: %s\n", dlerror());
dlclose(handle);
exit(EXIT_FAILURE);
}
调用函数
调用动态库中的函数,如下所示:
print_message();
释放动态库
使用dlclose函数释放动态库,如下所示:
dlclose(handle);
在Linux环境下,使用C语言调用动态库可以有效地减少程序的大小,提高程序的运行效率,本文详细介绍了动态库的创建、加载、调用和释放过程,希望能对您有所帮助,在实际开发过程中,还需要注意动态库的版本管理、依赖关系等问题。