在Linux系统中,.so
文件代表共享对象(Shared Object),它们是动态链接库,类似于Windows系统中的DLL文件。共享对象文件允许程序在运行时加载和使用库中的函数和数据,而不是在编译时将这些内容静态地嵌入到可执行文件中。这种方式有助于减少应用程序的大小,并允许多个程序共享同一份库代码,从而节省内存资源。
动态链接:程序在运行时才将库函数链接到程序中。 共享库:多个程序可以共享同一个库实例。 位置无关代码:库代码可以在内存的任何位置运行。
.a
):编译时链接到程序中。.so
):运行时链接。.so
文件的方法在C语言中,可以使用 dlopen
, dlsym
, 和 dlclose
函数来加载和使用共享库。
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h> // 包含动态链接库的头文件
int main() {
void *handle; // 用于存储库的句柄
char *error; // 存储错误信息
int (*func)(); // 定义一个函数指针类型
// 打开共享库
handle = dlopen("./mylib.so", RTLD_LAZY); // RTLD_LAZY 表示延迟绑定
if (!handle) {
fprintf(stderr, "%s\n", dlerror()); // 打印错误信息
exit(EXIT_FAILURE);
}
// 清除之前的错误信息
dlerror();
// 获取库中的函数指针
*(void **)(&func) = dlsym(handle, "myFunction");
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
dlclose(handle);
exit(EXIT_FAILURE);
}
// 调用库中的函数
int result = func();
printf("Function returned: %d\n", result);
// 关闭共享库
dlclose(handle);
return 0;
}
问题1:找不到 .so
文件
.so
文件存在于指定的路径,并且该路径包含在 LD_LIBRARY_PATH
环境变量中。问题2:符号未定义
问题3:版本不兼容
-ldl
选项以使用动态链接功能。.so
文件有执行权限。通过以上信息,你应该能够理解Linux C中加载 .so
文件的基础概念、优势、类型、应用场景以及如何解决常见问题。
领取专属 10元无门槛券
手把手带您无忧上云