Dynamic_Library_link_error

starlitxiling Lv3

常见报错信息

  • 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

常见原因

  1. 缺少依赖库
  2. 错误的RPATH设置
  3. 构建过程的代码中硬编码路径(比如CMake的find_library)
  4. 环境变量
    比如LD_LIBRARY_PATH(Linux)或DYLD_LIBRARY_PATH(macOS)设置有误,影响了库搜索路径
  5. 依赖的第三方库中内嵌不正确的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

build.rsRust项目的构建脚本,它通常用于编译C/C++依赖代码,检测系统环境和依赖,生成Rust代码或配置文件,向Cargo传递额外的编译器或链接器参数。构建脚本通过向标准输出打印特殊格式的信息,通知Cargo执行特定行为。

1
println!("cargo:rustc-link-search=/absolute/path/to/dependency");

这条语句告诉 Cargo,在调用 rustc 进行链接时,需要添加 -L /absolute/path/to/dependency 参数。该参数会告诉链接器在这个目录中查找静态库或动态库。
如果是系统库的话可以这么写,但是如果是从conda中查找库的话,就不能硬编码路径,可以这样:

1
2
let conda_lib = std::env::var("CONDA_PREFIX").unwrap_or_default() + "/lib";
println!("cargo:rustc-link-search={}", conda_lib);

或者在.cargo文件夹中创建config.toml文件:

1
2
[target.x86_64-unknown-linux-gnu]
rustflags = ["-C", "link-args=-Wl,-rpath,$ORIGIN/../lib"]
  • 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
On this page
Dynamic_Library_link_error