linux 动态链接库(.so)的生成和引用

动态链接库(.so)的生成和引用

一.简介

动态链接库:在Linux系统中,动态链接库(Dynamic Linking Library)是一种在运行时链接的共享库。相比于静态链接库,动态链接库可以在程序运行时加载,而不需要在编译时链接到程序中,这样可以减小可执行程序的大小,也方便了库的管理和更新。

动态链接库有两个主要的扩展名,分别是.so和.dll,其中.so文件是Linux系统下的动态链接库,.dll文件是Windows系统下的动态链接库。Linux系统下,动态链接库通常使用GCC编译器生成,使用-shared选项编译。在程序运行时,动态链接库会被动态地加载到内存中,多个程序可以共享同一个动态链接库,减少了内存占用和磁盘空间的使用。

动态链接库在Linux系统中被广泛使用,许多系统库和第三方库都是动态链接库,例如libc、libpthread、libssl等等。动态链接库的使用可以提高程序的可移植性、可维护性和安全性,是Linux系统下的重要特性之一。

二.动态链接库的生成

在Linux中,可以使用gcc命令将多个目标文件生成一个动态链接库(也称为共享库)。生成动态链接库的步骤如下:

--sodir
	|--so.c
	|--s0.h
	|--libtest.so
	
gcc  so.c -fPIC -shared  -L./sodir -o libtest.so 

-fPIC:生成与位置无关的代码,这是生成动态链接库所必需的。
-shared:告诉链接器生成动态链接库而不是可执行文件.
-L:指定源文件路径,源文件在当前编译路径下不需要。
-o:指定输出文件名.
so.c:参与编译的源文件.
libtest.so:lib为前缀,test为库名,.so为后缀。
注意:库名可以自由取名,但是前缀和后缀必须遵循规范,否则系统无法识别。

三.引用动态链接库

  1. 首先,我们创建一个名为 libhello.c 的源文件,其中包含了一个简单的 hello 函数:

    //libhello.c
    #include <stdio.h>
    void hello() {
        printf("Hello, world!\n");
    }
    
  2. 接着,我们使用 gcc 命令来编译这个源文件,并生成一个名为 libhello.so 的动态链接库:

    gcc -fPIC  -shared -o libhello.so libhello.c
    
  3. 现在,我们可以在另一个源文件中引用这个动态链接库,例如,我们创建一个名为 main.c 的源文件:

    //main.c
    void hello();
    
    int main() {
        hello();
        return 0;
    }
    
  4. 再编译main.c,生成可执行文件:

    gcc -o main main.c -L. -lhello
    
    -L:指定so文件所在的目录;
    -l:动态链接库名,去除前缀lib,去除后缀.so;
    
  5. 最后,执行main:

    保存信息,找不到动态链接库文件。

    在这里插入图片描述

    解决方法:将动态链接库所在的文件添加到环境变量中:

    export LD_LIBRARY_PATH=$(pwd)
    

    在这里插入图片描述

    其它解决方式:
    1.临时性的 export 环境变量=$环境变量:你要添加的路径
    2.写入/etc/profile
    3.写入到家目录的.bashrc
    4.写入到/etc/environment中

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的铁甲小宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值