linux库的制作

张开发
2026/4/17 18:41:38 15 分钟阅读

分享文章

linux库的制作
一、库文件介绍维度内容定义一组预先编译好的函数、类或数据的集合以文件形式存在用于被其他程序调用本质可执行代码的二进制形式是代码复用的一种方式将常用功能封装起来方便开发者在不同项目中使用作用1.提高开发效率避免重复编写相同功能的代码减少开发时间2.便于代码维护集中管理功能模块修改和升级库时只需更新库文件无需修改使用库的程序3.保护代码隐私将核心代码封装在库中只提供接口供外部使用隐藏实现细节分类说明库的分类静态库和共享库动态库跨平台问题不同平台如 Linux vs Windows的指令集、二进制格式、系统调用不同导致库无法跨平台直接使用如 Linux 的 .so 不能在 Windows 上运行Linux平台静态库命名libxxx.a以 lib 为前缀 自定义库名 .a 后缀Linux平台动态库命名libxxx.so以 lib 为前缀 自定义库名 .so 后缀动态库版本命名libxxx.so.x.y.z其中x 为主版本号不兼容旧版y 为次版本号兼容旧版z 为发行版本号修复问题不影响接口二、静态库介绍及制作2.1 静态库介绍在静态链接方式下最终生成的可执行文件不仅包含程序本身的编译后代码还包含了所依赖的静态库1和静态库2的全部被使用到的代码。维度内容定义静态库在程序编译链接阶段其代码会被完整地“复制”到最终生成的可执行文件中成为可执行文件的一部分。编译完成后静态库与可执行文件“绑定”运行时无需额外依赖特点1.可执行文件独立运行不依赖外部库文件2.静态库会使可执行文件体积较大但效率比较高3.若静态库更新需重新编译链接程序文件格式Windows平台为 .libLinux平台为 .aMac平台为 .a2.2 静态库制作及使用步骤说明示例命令准备源文件编写实现库功能的源文件如 .c 或 .cpp-编译生成目标文件使用编译器将源文件编译成目标文件如 .o 或 .objgcc -c 源文件.c -o 目标文件.o打包生成静态库使用归档工具将目标文件打包成静态库ar -cr 静态库.a 目标文件.o编译主程序并链接静态库编译主程序并链接静态库生成可执行文件。若库名为 libmyadd.a则库名写 myadd编译器自动拼接 lib 前缀和 .a 后缀查找库文件gcc 目标文件.o -l库名 -L库路径 -o 可执行文件最后一步可执行文件不需要加后缀2.3 静态库所用核心选项工具选项作用示例命令GCC-c只编译不链接生成目标文件.ogcc -c add.c -o add.oGCC-o指定输出文件名称gcc -c main.c -o main.oGCC-l指定要链接的库名省略lib前缀和.a后缀gcc main.c -lmyadd -o mainGCC-L指定库文件搜索路径gcc main.c -L./lib -lmyadd -o mainAR-c创建新的归档文件静态库ar -cr libmyadd.a add.oAR-r将目标文件添加到归档文件中替换已存在的文件ar -cr libmyadd.a add.o三、动态库介绍及制作3.1 动态库介绍动态链接仅在运行时调用动态库可执行文件体积小且便于库更新但需确保运行时库文件存在且版本兼容。调用动态库的时候是用库的符号表进行调动维度内容定义动态库也称之为共享库是在程序运行时才被加载到内存中可以被多个可执行文件共享使用为它们提供函数、数据等资源特点1.可执行文件运行时需依赖系统中存在的动态库2.可执行文件体积小只记录的动态库的引用没有记录全部的库有效节省磁盘和内存空间3.更新灵活只要接口不变无需重新编译依赖它的可执行文件文件格式Windows平台为 .dllLinux平台为 .soMac平台为 .dylib3.2 动态库制作及使用步骤说明示例命令准备源文件编写实现库功能的源文件如 .c 或 .cpp-编译生成与位置无关的目标文件使用编译器编译源文件时添加 -fPIC 选项生成位置无关代码PIC的目标文件gcc -c -fPIC 源文件.c -o 目标文件.o链接生成动态库使用编译器将目标文件链接为动态库多个程序可共享同一份动态库文件节省内存gcc -shared 目标文件.o -o 动态库.so编译时链接动态库编译时通过 -L 指定路径、-l 指定库名生成可执行文件库名不包含前缀和后缀gcc 源文件.c -l库名 -L库路径 -o 可执行文件可能还需要创建符号链接动态库版本管理中的可选步骤用于为带版本号的动态库如 libxxx.so.1.0.0创建简化的符号链接如 libxxx.so方便编译时查找。3.3 加载动态库方法运行时加载动态库方法说明示例操作LD_LIBRARY_PATH环境变量通过环境变量临时指定库搜索路径export LD_LIBRARY_PATH$PWD/etc/ld.so.conf配置文件编辑配置文件添加库路径然后更新缓存sudo vim /etc/ld.so.conf添加路径然后sudo ldconfig系统默认路径将库放入系统默认目录更新缓存通过mv命令系统级库放/usr/lib用户自定义库放/usr/local/lib然后sudo ldconfig运行时加载动态库方法优点缺点LD_LIBRARY_PATH环境变量方便临时测试无需修改系统配置仅对当前终端生效不持久可能被滥用/etc/ld.so.conf配置文件系统级生效永久有效影响所有用户需要 root 权限系统默认路径简单直接无需额外配置可能污染系统库目录与包管理器管理的库冲突3.4 动态库所用核心选项工具选项作用示例gcc编译阶段-c只编译不链接生成目标文件.o不生成可执行程序gcc -c add.c -o add.ogcc编译阶段-fPIC生成位置无关代码PIC确保动态库可被加载到内存任意地址并正常运行动态库必需gcc -c -fPIC add.c -o add.ogcc编译阶段-o指定输出文件名称如目标文件.o或动态库.sogcc -c -fPIC add.c -o add.ogcc链接阶段-shared将目标文件.o链接为动态库.so是生成动态库的核心选项gcc -shared add.o -o libmyadd.sogcc使用阶段-L指定动态库的搜索路径编译时用于查找 .so 文件gcc main.c -lmyadd -L./lib -o maingcc使用阶段-l指定要链接的动态库名称省略lib前缀和.so后缀如 libmyadd.so 对应 -lmyaddgcc main.c -lmyadd -L. -o main系统工具ldconfig更新系统动态库缓存使新添加的动态库如放入/usr/lib被系统识别需sudo权限sudo ldconfig-static 表示静态链接四、静态库与动态库的区别对比维度静态库动态库链接方式编译时链接运行时链接可执行文件体积体积大体积小内存占用多个程序使用时每个程序都有一份库的副本占用内存多多个程序共享同一份库内存中只有一份副本节省内存更新维护库更新需重新编译链接程序库更新只需替换库文件无需重新编译链接程序依赖性无运行时依赖有运行时依赖库缺失程序无法运行适用场景适合对程序独立性要求高、库不常更新、且对可执行文件启动速度有要求的场景适合库需要频繁更新、多个程序共享库功能、且希望减小可执行文件体积的场景静态库在程序运行的时候不需要在系统中因为静态库编译时已链接到程序运行时无需依赖静态库与动态库的核心差异在于链接时机。五、库制作常见问题及解决方案问题类型可能原因解决方法静态库链接时提示未定义的引用库文件路径错误、库名拼写错误、库中确实不存在该函数或变量的定义检查库路径和库名是否正确确认库中是否实现了所需功能动态库运行时提示无法找到库文件库文件路径未加入系统默认搜索路径或未通过环境变量指定将动态库复制到系统默认库路径如 /usr/local/lib或设置相应的环境变量如 Linux 的 LD_LIBRARY_PATH动态库版本冲突程序依赖的动态库版本与系统中安装的版本不一致安装程序所需版本的动态库或重新编译程序使其适配系统中的库版本

更多文章