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-01-13 17:18:09
- 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