.so 库的动态加载和静态加载
时间: 2023-09-22 10:14:42 浏览: 133
.so是Linux下的共享库文件,可以被动态加载或静态链接。
动态加载是指在程序运行时,通过调用dlopen函数加载共享库,将库中的函数映射到程序的地址空间中,程序可以直接调用共享库中的函数。动态加载可以减小程序的内存占用,因为程序只有在需要用到共享库函数时才会加载该共享库。
静态链接是指在编译时将共享库的代码直接连接到程序中,生成一个独立的可执行文件。这样程序在运行时就不需要再加载共享库。静态链接可以使程序运行更加稳定,因为程序与共享库的依赖关系已经在编译时确定,但是会增加程序的内存占用和磁盘空间占用。
相关问题
qt静态加载.so库
在Qt中,可以使用静态链接来加载.so库。具体步骤如下:
1. 将.so文件复制到Qt项目的文件夹中。
2. 在.pro文件中添加以下内容:
```
LIBS += -L/path/to/so/file -lso_filename_without_lib_prefix
```
其中,/path/to/so/file是.so文件所在的路径,so_filename_without_lib_prefix是.so文件的名称(去除lib前缀和.so后缀)。
3. 在代码中使用以下语句加载.so库:
```
QLibrary lib("/path/to/so/file/so_filename_without_lib_prefix.so");
if (lib.load()) {
// 加载成功,可以使用库中的函数
// 获取函数指针
typedef void (*FuncType)();
FuncType func = (FuncType)lib.resolve("function_name_in_so");
if (func) {
// 调用函数
func();
}
} else {
// 加载失败
}
```
其中,function_name_in_so是.so库中的函数名称。注意,要先通过QLibrary的load()函数加载.so库,然后才能获取到库中函数的指针并调用。
.so文件需要main函数吗_Linux下动态库(.so)和静态库(.a) 的区别
首先,对于Linux下的动态库(.so),不需要包含main函数。动态库是一种在程序运行时加载的库,在程序运行时动态链接到程序中,而不是在编译时链接。因此,动态库不需要包含main函数,因为它们并不是独立的可执行文件。
而静态库(.a)则是在编译时链接到程序中的库,它们被打包成一个可重定位的目标文件。因此,静态库需要包含main函数,因为它们被链接到程序的可执行文件中,而且需要一个入口点来启动程序。
在使用动态库时,需要在程序中显式地加载动态库,并将其链接到程序中。而在使用静态库时,库文件在编译时就被链接到程序中,因此程序在运行时不需要再加载库文件,但是可执行文件的体积会比较大。
阅读全文