为何cargo run可正常运行,直接执行二进制文件却缺失共享库?
问题分析与解决
为什么cargo run --release能正常运行,直接执行二进制文件却报错?
是的,cargo run --release会隐式设置环境变量帮助程序找到依赖的动态库:
- Linux系统下,它会自动将构建过程中生成/下载的共享库所在路径添加到
LD_LIBRARY_PATH环境变量; - macOS系统下则对应
DYLD_LIBRARY_PATH。
这些库的路径通常在target/release/build/的子目录中,直接执行二进制时,系统不会自动加载该路径,因此找不到libonnxruntime.so.1.8.1。
解决方法
方法1:临时设置环境变量运行
先定位libonnxruntime.so.1.8.1的所在目录,将其加入LD_LIBRARY_PATH后再运行二进制:
# 自动查找库的路径并设置环境变量 export LD_LIBRARY_PATH=$(find target/release/build -name "libonnxruntime.so.1.8.1" -exec dirname {} \;):$LD_LIBRARY_PATH # 运行二进制文件 ./target/release/onnx-test
方法2:静态编译onnxruntime(推荐)
修改Cargo.toml中onnxruntime的依赖配置,启用静态编译特性,将onnxruntime的代码打包到二进制文件中,彻底摆脱对外部共享库的依赖:
[dependencies] # 其他依赖保持不变 onnxruntime = { version = "0.0.14", features = ["static"] }
重新编译项目:
cargo build --release
生成的二进制文件可直接运行,无需额外配置环境变量。
方法3:将库复制到系统标准路径
找到libonnxruntime.so.1.8.1并复制到系统默认的库查找路径(如/usr/local/lib),再更新系统库缓存:
# 查找并复制库文件 find target/release/build -name "libonnxruntime.so.1.8.1" -exec cp {} /usr/local/lib \; # 更新系统库缓存 sudo ldconfig
此方法适合长期使用该程序的场景,但需要管理员权限。
内容的提问来源于stack exchange,提问作者nerdizzle
相关产品推荐
相关产品推荐

