一、什么是动态库

说明:动态库(通常以.so结尾, shared object), 在编译链接期只做一些验证工作,并不会被复制到程序中,程序运行的时候才回去加载所需的动态库。

优点:节省磁盘和内存空间(多个程序可共享),库更新无需重新编译主程序(接口兼容的前提下)。

缺点:部署稍复杂,需要确保运行环境有正确的库版本,略微增加运行时的开销。

二、简单示例

1)准备相关源代码

        (1)test.c文件

#include "test.h"

int test_add_func(int a, int b)
{
    return a+b;
}

        (2)test.h文件

#ifndef __TEST_H  // 定义以防止递归包含
#define __TEST_H

// (1)、其它头文件
#include <stdio.h>

// (2)、宏定义(函数、变量、常量)

// (3)、自定义类型(结构体、联合体、枚举、函数指针类型等...)

// (4)、函数声明
extern int test_add_func(int a, int b);

// (5)、全局变量声明

// (6)、静态函数定义

// (7)、静态变量定义

#endif

        (3)main.c文件

#include "test.h"

int main(int argc, char const *argv[])
{
    int result = test_add_func(1, 1);
    printf("result == %d\n", result);
    return 0;
}

2)编译生成位置无关目标文件(.o文件)

说明:这是创建动态库关键一步,我们需要使用-fPIC(position Independent Code)选项来生成位置无关的代码,这使得代码可以被加载到内存的任意位置而不需要修改,这是共享库所必须的。

1.终端命令:

gcc -c -fPIC test.c -o test.o

3)创建动态库(.so文件)

说明:使用gcc -shared选项将目标文件链接成共享库

1.终端命令:

gcc -shared -o libexample_test.so test.o

4)链接动态库进行编译

说明:编译main.c并链接到动态库,语法和静态库一样

注意:此时生成的main只是知道自己需要libexample_test.so库,但是不知道去哪里找到这个库。

1.终端命令:

gcc main.c -o main -L ./ -lexample_test

5)运行程序

1.终端命令:

./main

5)总结

1.定义与核心特性

动态库又称共享库(Shared Library),是包含可复用函数、数据或资源的二进制文件集合,其特点包括:

  1. 运行时加载:代码不嵌入可执行文件,仅在程序运行时由操作系统动态加载至内存

  2. 资源共享:多个进程可共享同一动态库的代码段,减少内存占用

  3. 独立更新:库文件更新后,依赖程序无需重新编译即可使用新版本

  4. 跨语言支持:可通过标准接口被C、C++、Python等多种语言调用

2.编译时需要用到的命令关键字:

  • -fPIC:生成位置无关代码,确保库可被加载到任意内存地址
  • -shared:指定生成动态库而非可执行文件

动态库技术通过灵活的运行时链接机制,在代码复用、资源优化和系统扩展性之间实现了重要平衡。开发中需根据项目规模、部署环境及维护需求,合理选择动态库与静态库的组合方案

Logo

葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。

更多推荐