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 
    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)
    

    linux 动态链接库(.so)的生成和引用_第1张图片

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

你可能感兴趣的:(linux,linux,运维,服务器)