1 背景
2、常见系统依赖组件
系统_架构 | 动态依赖库 | 说明 |
linux_amd64 | libdl.so.2 | 动态链接库 |
libstdc++.so.6 | C++ 标准库,最低 libstdc++.so.6.0.19 | |
libm.so.6 | 数学库,最低 libm-2.17.so | |
GCC 支持库,最低 gcc (GCC) 4.8.5 | ||
libc.so.6 | C 标准库,最低 GLIBC_2.17 | |
动态链接器 | ||
linux_arm64 | libdl.so.2 | 动态链接库 |
libstdc++.so.6 | C++ 标准库,最低 libstdc++.so.6.0.19 | |
libm.so.6 | 数学库,最低 libm-2.17.so | |
GCC 支持库,最低 gcc (GCC) 4.8.5 | ||
libc.so.6 | C 标准库,最低 GLIBC_2.17 | |
动态链接器 | ||
windows_amd64 | ucrtbase.dll | Universal C Runtime |
msvcp140.dll | Microsoft Visual C++ Runtime | |
msvcrt.dll | Microsoft Visual C Runtime | |
vcruntime140.dll | Visual C++ Runtime | |
windows32不支持 |
如果操作系统缺失此类依赖,需要自行安装解决, 更多平台支持:https://duckdb.org/docs/1.2/dev/building/overview
3 安装方式
- 对于Ubuntu/Debian:
sudo apt-get update sudo apt-get install libc6 libstdc++6 libgcc1 libm6
- 对于 CentOS/RHEL:
sudo yum install glibc libstdc++ libgcc libm
- 对于windows:
方法1:安装Microsoft Visual C++ Redistributable(推荐)
x64版本:适用于64位系统
x86版本:适用于32位系统
方法2:手动复制DLL文件
找到缺失的DLL文件
复制到应用程序目录或系统目录(通常在 C:\Windows\System32\ 目录下)
注册DLL文件(如果需要)
4 动态依赖库依赖查找机制
1、加载主库时的依赖查找流程
Java 层做了什么?
只负责定位主库文件(如 libfoo.so、foo.dll),并调用底层的 dlopen(Linux/macOS)或 LoadLibrary(Windows)加载它。
不会主动递归查找依赖库,也不会解析 ELF/PE/Mach-O 文件的依赖字段。
2、依赖库查找的详细机制
1)Linux (ELF, dlopen)
依赖声明:在 ELF 文件的 NEEDED 字段(可用 readelf -d libfoo.so 查看)。
查找顺序(简化):
DT_RPATH/DT_RUNPATH(库文件内嵌路径)
LD_LIBRARY_PATH 环境变量
/etc/ld.so.cache(系统缓存)
/lib, /usr/lib, /usr/local/lib
递归加载:dlopen 会自动递归加载所有依赖库,遇到缺失会报错。
2)Windows (LoadLibrary)
依赖声明:PE 文件的 IMPORT TABLE。
查找顺序(简化):
调用 LoadLibrary 时指定的目录
程序当前目录
System32、Windows 目录
PATH 环境变量
递归加载:LoadLibrary 会自动递归加载所有依赖 DLL。
3)macOS (dyld)
依赖声明:Mach-O 文件的 LC_LOAD_DYLIB。
查找顺序(简化):
@rpath、@loader_path、@executable_path
DYLD_LIBRARY_PATH 环境变量
系统默认路径 /usr/lib 等