• 【C/C++】动态库和静态库


    软件开发中,库(Library)是重要的构建模块,可以提供可重用的代码和功能。动态库和静态库是两种常见的库文件形式。本文将介绍两种库的定义,并给出动态库和静态库的编译示例。

    静态库与动态库的定义

    静态库

    静态库(Static Library)是一种库文件形式,它在编译时完整地复制到最终的可执行文件中。静态库的代码与应用程序的代码合并成一个独立的可执行文件。在链接时,链接器将静态库的代码与应用程序的代码合并,生成一个包含库代码的可执行文件。静态库的代码在编译时已经确定,无需额外加载,并且每个应用程序包含一份完整的库代码。

    动态库

    动态库(Dynamic Library)是一种库文件形式,它在编译时只记录对库中函数和符号的引用,并不将库的代码复制到最终的可执行文件中。动态库在运行时被加载到内存中,并通过动态链接器与应用程序建立关联,以供应用程序调用。动态库的加载发生在运行时,因此需要额外的加载步骤。动态库在内存中只加载一份,可以被多个应用程序共享。

    示例

    下面是一个具体的示例,展示如何创建和使用静态库和动态库。

    假设我们有一个简单的数学库,其中包含两个函数:add() 和 subtract(),用于执行加法和减法操作。

    创建和使用静态库的示例

    1. 创建数学库的源代码文件 math.c
    // math.c
    
    int add(int a, int b) {
        return a + b;
    }
    
    int subtract(int a, int b) {
        return a - b;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 编译数学库为静态库 libmath.a(在 Linux 和 macOS 上):
    $ gcc -c math.c -o math.o
    $ ar rcs libmath.a math.o
    
    • 1
    • 2
    1. 创建一个使用静态库的应用程序 main.c
    // main.c
    #include 
    
    // 静态库的函数声明
    extern int add(int a, int b);
    extern int subtract(int a, int b);
    
    int main() {
        int result1 = add(5, 3);
        int result2 = subtract(10, 4);
    
        printf("Addition result: %d\n", result1);
        printf("Subtraction result: %d\n", result2);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. 编译并链接应用程序与静态库:
    $ gcc main.c -o app -L. -lmath
    
    • 1
    1. 运行应用程序:
    $ ./app
    
    • 1

    输出:

    Addition result: 8
    Subtraction result: 6
    
    • 1
    • 2

    创建和使用动态库的示例

    1. 创建数学库的源代码文件 math.c(与静态库示例中的代码相同)。

    2. 编译数学库为动态库 libmath.so(在 Linux 和 macOS 上):

    $ gcc -shared -fpic math.c -o libmath.so
    
    • 1
    1. 创建一个使用动态库的应用程序 main.c(与静态库示例中的代码相同)。

    2. 编译并链接应用程序与动态库:

    $ gcc main.c -o app -L. -lmath
    
    • 1
    1. 运行应用程序之前,需要将动态库路径添加到运行时库搜索路径,或者将动态库复制到系统库路径中,或者设置 LD_LIBRARY_PATH 环境变量。假设当前目录为动态库所在的目录,可以使用以下命令运行应用程序:
    $ export LD_LIBRARY_PATH=.
    $ ./app
    
    • 1
    • 2

    输出:

    Addition result: 8
    Subtraction result: 6
    
    • 1
    • 2

    在这个示例中,首先创建了一个数学库,包含了两个函数。然后,编译数学库为静态库和动态库。接下来,编写了一个使用库函数的应用程序,并在编译和链接过程中指定了库的位置。最后,运行应用程序,它会调用数学库中的函数并打印结果。

    这个示例展示了如何使用静态库和动态库,它们在编译和链接过程中有一些差异,但在应用程序中的使用方式是相同的。

  • 相关阅读:
    ArcgisForJS如何在线编辑ArcGIS Server发布的几何要素?
    王者并发课-铂金3:一劳永逸-如何理解锁的多次可重入问题
    解锁Mysql中的JSON数据类型,怎一个爽字了得
    [vscode]使用cmake时将命令行参数传递给调试目标
    spring缓存注解@Cacheable和@CacheEvict,设置过期时间和批量模糊删除
    webpack编译运行了两次
    python 文件操作
    数据库基础(一)【MySQL】
    漏洞分析丨HEVD-0x9.UseAfterFree[win7x86]
    Python和labview先学哪个
  • 原文地址:https://blog.csdn.net/m0_47406832/article/details/133876894