Linux下动态库初级入门
一、什么是动态库
说明:动态库(通常以.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),是包含可复用函数、数据或资源的二进制文件集合,其特点包括:
-
运行时加载:代码不嵌入可执行文件,仅在程序运行时由操作系统动态加载至内存
-
资源共享:多个进程可共享同一动态库的代码段,减少内存占用
-
独立更新:库文件更新后,依赖程序无需重新编译即可使用新版本
-
跨语言支持:可通过标准接口被C、C++、Python等多种语言调用
2.编译时需要用到的命令关键字:
- -fPIC:生成位置无关代码,确保库可被加载到任意内存地址
- -shared:指定生成动态库而非可执行文件
动态库技术通过灵活的运行时链接机制,在代码复用、资源优化和系统扩展性之间实现了重要平衡。开发中需根据项目规模、部署环境及维护需求,合理选择动态库与静态库的组合方案
葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。
更多推荐


所有评论(0)