程式運行時動態鏈接器需找到共享庫,Linux 提供三種層級的庫路徑配置方式,適用場景各異。
LD_LIBRARY_PATH(臨時、用戶級)export LD_LIBRARY_PATH=/usr/lib64:/opt/app/lib
/etc/ld.so.conf + ldconfig(永久、系統級)echo "/usr/lib64" >> /etc/ld.so.conf ldconfig
ldconfig 掃描配置文件列出的目錄,構建緩存 /etc/ld.so.cache,運行時動態鏈接器直接查緩存。ldconfig 更新緩存。補充:/etc/ld.so.conf.d/*.conf 目錄下的文件也會被自動包含,建議將第三方庫路徑寫入獨立 .conf 文件,便於管理。
-Wl,-rpath(程式級、最高優先級)gcc -Wl,-rpath=/usr/lib64 -o myapp main.c
DT_RPATH 或 DT_RUNPATH 動態段。$ORIGIN 相對路徑可實現可遷移部署)。進階技巧:-Wl,-rpath='$ORIGIN/../lib' 使用 $ORIGIN 表示可執行文件所在目錄,實現相對路徑查找庫,解決部署路徑不固定問題。
DT_RPATH (編譯期 -rpath,若無 DT_RUNPATH)LD_LIBRARY_PATHDT_RUNPATH (編譯期 -rpath,新版 ld 默認生成)/etc/ld.so.cache (由 ldconfig 生成)/lib、/usr/lib、/lib64、/usr/lib64# 查看程式依賴庫及解析路徑 ldd /path/to/binary # 查看動態段 RPATH/RUNPATH readelf -d /path/to/binary | grep -E 'RPATH|RUNPATH' # 手動指定庫路徑運行 LD_LIBRARY_PATH=/custom/lib ./binary
/etc/ld.so.conf.d/ + ldconfig。-Wl,-rpath='$ORIGIN/../lib',部署時將庫放在 lib/ 同級目錄。export LD_LIBRARY_PATH。LD_LIBRARY_PATH,易引發版本衝突、安全風險。理解三種方式的層級、優先級與適用場景,能快速解決「庫找不到」、「載入錯誤版本」等經典動態鏈接問題。