简单理解:DLL 库 和 SO 库

张开发
2026/4/27 18:51:21 15 分钟阅读

分享文章

简单理解:DLL 库 和 SO 库
DLL 库 和 SO 库 通俗讲清楚这俩是操作系统里的「动态链接库」—— 本质就是封装好的代码工具箱程序运行时才加载不用打包进 exe 里节省空间、方便升级。一、最简单的区别DLLDynamic Link Library→Windows 系统专用的动态库文件后缀.dllSOShared Object→Linux / Unix / Android 系统专用的动态库文件后缀.so一句话Windows 用 DLLLinux / 安卓 用 SO功能一样系统不同。二、它们是干嘛的代码复用多个程序可以共用同一个库不用重复写代码。节省体积程序不把库打包进去运行时才加载。方便升级修复 bug 时只替换 dll/so 文件不用重新编译整个程序。隐藏代码核心算法编译成库别人看不到源码只能调用。三、核心差异一看就懂项目DLLWindowsSOLinux所属系统WindowsLinux / macOS / Android文件后缀.dll.so依赖路径系统目录、当前目录、环境变量LD_LIBRARY_PATH、系统库路径依赖关系自带依赖容易缺 DLL依赖系统环境相对稳定调用方式LoadLibrary / 隐式链接dlopen / 隐式链接常见问题DLL 缺失、版本不兼容SO 找不到、版本错误四、什么时候会用到1. 写代码时Windows编译出.dll给 exe 调用Linux编译出.so给二进制程序调用2. 运行软件时打开软件提示找不到 xxx.dll→ Windows 缺库运行程序提示error while loading shared libraries→ Linux 缺 so 库3. 安卓开发APP 里的 JNI 底层逻辑几乎都是.so 库。五、静态库 vs 动态库补充静态库.libWindows /.aLinux代码直接打包进程序运行不需要库文件但程序体积大。动态库.dll/.so程序不打包库运行必须带上库文件体积小、易升级。超级总结DLL Windows 动态库SO Linux / 安卓 动态库功能完全一样只是系统不同都是给程序提供功能的「代码工具箱」一、静态库 / 动态库 后缀速记静态库.lib动态库.dll 配套.lib(导入库)Linux / Android静态库.a动态库.so二、GCC 编译Linux 生成 使用 .so1. 生成动态库 libtest.so# 编译为位置无关代码 -fPIC gcc -c -fPIC test.c -o test.o # 链接生成so动态库 gcc -shared test.o -o libtest.so2. 主程序调用 so# 编译主程序链接动态库 gcc main.c -ltest -L. -o main # 运行临时指定库路径 export LD_LIBRARY_PATH./ ./main三、Windows MinGW 生成 使用 DLL1. 生成 test.dll# 编译生成dll和导入库libtest.lib gcc -shared test.c -o test.dll -Wl,--out-impliblibtest.lib2. 主程序调用 DLLgcc main.c -ltest -L. -o main.exe运行时把test.dll和main.exe放同一目录即可。四、静态库 快速命令补充Linux 生成 .agcc -c test.c ar rcs libtest.a test.o gcc main.c libtest.a -o mainWindows MinGW 生成 .lib 静态库gcc -c test.c ar rcs test.lib test.o五、两种调用方式重点隐式链接上面命令编译时就绑定库简单常用。显式动态加载代码里手动加载WindowsLoadLibrary()加载 dllLinuxdlopen()加载 so适合插件化、按需加载场景。六、嵌入式 / 安卓补充Android 交叉编译 .so 只需要换交叉编译器参数不变-fPIC -shared这两个核心参数不变适配所有嵌入式 Linux。

更多文章