在 Linux 系统中,程序链接分为编译时链接(构建阶段)和运行时链接(执行阶段),两者路径设置相互独立。以下是核心区别和配置方法:
⚙️ 一、编译时链接路径(Build-time Linking)
作用阶段:程序编译/链接期间(由链接器 ld处理)。
搜索顺序:
- -L显式指定路径:优先级最高,如 gcc -L/path/to/libs -lmylib。
- -rpath-link路径:解决间接依赖(如 libA.so依赖 libB.so),仅链接时有效。
- LIBRARY_PATH环境变量:全局设置编译时库搜索路径,如 export LIBRARY_PATH=/path/to/libs:$LIBRARY_PATH。
- 预定义路径(SEARCH_DIR):链接器内置路径(如 /usr/lib、/lib),可通过 ld --verbose | grep SEARCH_DIR查看。
关键特点:
- 仅影响编译阶段,不写入可执行文件;
- 未找到库会直接导致链接失败(如 cannot find -lmylib)。
🚀 二、运行时链接路径(Run-time Linking)
作用阶段:程序执行期间(由动态链接器 ld-linux.so处理)。
搜索顺序:
- -rpath嵌入路径:通过 -Wl,-rpath=/path/to/libs编译时写入可执行文件,优先级最高。
- LD_LIBRARY_PATH环境变量:临时设置运行时路径,如 export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH。
- /etc/ld.so.conf配置:系统级路径(需 sudo ldconfig更新缓存)。
- 默认路径:/lib、/usr/lib等。
关键特点:
- 路径需在程序运行时可访问;
- 未找到库会导致运行时错误(如 error while loading shared libraries)。