Linux环境显式使用动态库

简介: Linux环境显式使用动态库

前一篇文章中 libstar.so 是动态链接到 libc 库的。如果 zeus.c 需要静态链接 libc ,会导致什么问题呢?

假设这个 libstar.so 是第三方提供的动态库,我们没有这个 libstar.so 动态库的源码。但是我们自身的项目 zeus 需要使用静态libc,就会这样进行链接,如下:

gcc -o zeus zeus.o -L/usr/local/star/lib -Wl,-Bstatic -lc -Wl,-Bdynamic -lstar

上面的命令没有使用 -static 选项,因为它会导致所有的库都以静态方式链接,所以使用了原始的 Wl 选项。

上面的命令虽然能正常生成 zeus ,但是运行会直接报错,如下:

这时候,如果如果我们有 libstar.so 的源代码,是不是可以设置 生成 libstar.so 的时候 静态链接到 libc。尝试一下,命令如下:

gcc -fPIC -shared -o libstar.so sun.o moon.o earth.o -static 
# 或者
gcc -fPIC -shared -o libstar.so sun.o moon.o earth.o -Wl,-Bstatic -lc

上面两条命令其实都会报错,如下:

所以怎么办呢?这种情况,目前有两种解决方法,第三方库 libstar 不要编译出动态库,直接用静态库就完事了。生成静态库不会进行链接。

但是,如果你没有 libstar 的源代码,只有第三方公司提供 libstar.so 动态库。而你的程序为了兼容,又需要静态链接 libc.a。

这时候可以使用 显式调用动态库的方法,把 zeus.c 的代码改成下面的:

#include <stdio.h>
#include <dlfcn.h>
int main()
{
    int (*sun_rotate)();
    void* star_so = dlopen("/usr/local/star/lib/libstar.so",RTLD_LAZY);
    if (!star_so){
        printf("Open Error:%s.\n",dlerror());
        return 0;
    }
    sun_rotate = dlsym(star_so,"sun_rotate");
    printf("zeus do something \r\n");
    (*sun_rotate)();
    return 0;
}

执行编译命令:

gcc -o zeus zeus.o -ldl -static

虽然会报一个 warning ,但是可以正常跑。这样,我们的 zeus 程序就是静态链接 libc,而 libstar.so 是动态链接libc。

因为这是两个C运行时库不一样,一个是动态的 ,一个是静态的,用的时候要小心,可能你调 libstar.so 拿到的变量。在 libc 静态库函数里面不能用。


参考资料:

1,《linux下动态链接库的显式调用和隐式调用》

目录
相关文章
|
17天前
|
Oracle Java 关系型数据库
Linux环境安装配置JDK11
Linux环境安装配置JDK11
47 0
|
1天前
|
Linux vr&ar C语言
|
2天前
|
存储 Linux 编译器
【Linux】详解动态库链接和加载&&对可执行程序底层的理解
【Linux】详解动态库链接和加载&&对可执行程序底层的理解
|
4天前
|
关系型数据库 MySQL Linux
在Linux系统上实现高效安装与部署环境的全方位指南
在Linux系统上实现高效安装与部署环境的全方位指南
|
5天前
|
存储 Linux 编译器
【探索Linux】P.13(文件系统 | 软硬链接 | 动态库和静态库)
【探索Linux】P.13(文件系统 | 软硬链接 | 动态库和静态库)
12 0
|
5天前
|
运维 NoSQL Linux
linux环境收集core文件步骤
请注意,生成core文件可能会占用磁盘空间,因此应谨慎使用。一旦完成故障排查,建议将相关的core文件删除以释放磁盘空间。
32 5
|
6天前
|
运维 NoSQL Linux
linux环境收集core文件步骤
请注意,生成core文件可能会占用磁盘空间,因此应谨慎使用。一旦完成故障排查,建议将相关的core文件删除以释放磁盘空间。
20 4
|
12天前
|
Linux 开发者
【亮剑】Linux系统中的四种文件锁定机制:flock、fcntl、lockfile和flockfile,用于多进程环境下协调共享资源访问,防止数据损坏和竞争条件
【4月更文挑战第30天】本文介绍了Linux系统中的四种文件锁定机制:flock、fcntl、lockfile和flockfile,用于多进程环境下协调共享资源访问,防止数据损坏和竞争条件。flock适合脚本,fcntl提供底层灵活性,lockfile用于管理锁定文件,flockfile则结合两者功能。选择锁定策略时需考虑应用场景,如脚本可选flock,复杂需求则用fcntl。理解并正确使用这些工具对保证系统稳定性和数据一致性至关重要。
|
14天前
|
存储 Linux 编译器
Linux静态库与动态库的使用
Linux静态库与动态库的使用
|
15天前
|
编解码 Linux
FFmpeg开发笔记(十二)Linux环境给FFmpeg集成libopus和libvpx
在《FFmpeg开发实战》一书中,介绍了如何在Linux环境下为FFmpeg集成libopus和libvpx,以支持WebM格式的Opus和VP8/VP9编码。首先,下载并安装libopus。接着,下载并安装libvpx。最后,在FFmpeg源码目录下,重新配置FFmpeg,启用libopus和libvpx,编译并安装。通过`ffmpeg -version`检查版本信息,确认libopus和libvpx已启用。
FFmpeg开发笔记(十二)Linux环境给FFmpeg集成libopus和libvpx