Dynamic_Library_link_error
 
			常见报错信息
- macOS: - 1 - dyld: Library not loaded: @rpath/libz.1.dylib 
- Linux: - 1 - error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory 
RPATH(Run-time Library Search Path)
RPATH是嵌入在可执行文件或动态库中的路径信息,用于告诉运行时链接器在哪些目录查找依赖的共享库。
- 嵌入性:在编译链接阶段内嵌入二进制文件中,运行时自动生效。
- 永久性:修改后的RPATH信息保存在文件中,除非重新编译或修改,否则永久生效。
- 灵活性:可通过工具或者编译选项设置、修改RPATH
常见原因
- 缺少依赖库
- 错误的RPATH设置
- 构建过程的代码中硬编码路径(比如CMake的find_library)
- 环境变量
 比如LD_LIBRARY_PATH(Linux)或DYLD_LIBRARY_PATH(macOS)设置有误,影响了库搜索路径
- 依赖的第三方库中内嵌不正确的RPATH
解决方法
可以通过工具修改RPATH。
- macOS: 
 修改- Mach-O格式二进制文件中的- RPATH。- 1 - install_name_tool -add_rpath "$CONDA_PREFIX/lib" "$HOME/Work/dora/target/release/dora" - 第二个参数是你要修改的二进制文件,第一个参数是你要让这个二进制文件指向库的路径。 
- Linux: 
 先通过系统自带的包管理器安装- patchelf。
 打印当前- RPATH:- 1 - patchelf --print-rpath path/to/your/executable 
设置RPATH:
| 1 | patchelf --set-rpath "/usr/local/lib:/opt/mydeps/lib" path/to/your/executable | 
修改动态链接器路径:
| 1 | patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 path/to/your/executable | 
Rust中cargo:rustc-link-search指令
build.rs是Rust项目的构建脚本,它通常用于编译C/C++依赖代码,检测系统环境和依赖,生成Rust代码或配置文件,向Cargo传递额外的编译器或链接器参数。构建脚本通过向标准输出打印特殊格式的信息,通知Cargo执行特定行为。
| 1 | println!("cargo:rustc-link-search=/absolute/path/to/dependency"); | 
这条语句告诉 Cargo,在调用 rustc 进行链接时,需要添加 -L /absolute/path/to/dependency 参数。该参数会告诉链接器在这个目录中查找静态库或动态库。
如果是系统库的话可以这么写,但是如果是从conda中查找库的话,就不能硬编码路径,可以这样:
| 1 | let conda_lib = std::env::var("CONDA_PREFIX").unwrap_or_default() + "/lib"; | 
或者在.cargo文件夹中创建config.toml文件:
| 1 | [target.x86_64-unknown-linux-gnu] | 
- Title: Dynamic_Library_link_error
- Author: starlitxiling
- Created at : 2025-01-07 17:17:23
- Updated at : 2025-02-05 21:04:40
- Link: http://starlitxiling.github.io/2025/01/07/Dynamic-Library-link-error/
- License: This work is licensed under CC BY-NC-SA 4.0.
        Comments