linux可执行文件运行时加载库路径 rpath

博客讨论了在运行可执行文件时遇到找不到动态库libwiringPi.so的错误。通过readelf-d命令查看了加载库路径,并指出在CMakeLists.txt中使用set(CMAKE_CXX_FLAGS-Wl,--rpath=${ORIGIN}

运行可执行文件时候报找不到动态库

 error while loading shared libraries: libwiringPi.so: cannot open shared object file: No such file or directory

通过readelf -d 可执行文件,可以看到加载库路径

pi@raspberrypimini:~/xxxx$ readelf -d xxxx

Dynamic section at offset 0x11ff9c contains 44 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libglib-2.0.so.0]
 0x00000001 (NEEDED)                     Shared library: [libgio-2.0.so.0]
 0x00000001 (NEEDED)                     Shared library: [libgobject-2.0.so.0]
 0x00000001 (NEEDED)                     Shared library: [libgmodule-2.0.so.0]
 0x00000001 (NEEDED)                     Shared library: [libz.so.1]
 0x00000001 (NEEDED)                     Shared library: [libffi.so.7]
 0x00000001 (NEEDED)                     Shared library: [librt.so.1]
 0x00000001 (NEEDED)                     Shared library: [libdl.so.2]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
 0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000f (RPATH)                      Library rpath: [${ORIGIN}/lib:/data/myprojects/xxx/lib:/data/myprojects/xxx/s                       rc/3rd/gdbus/lib:/data/myprojects/xxxx/src/3rd/wiringPi/lib]

Library rpath 就是运行时加载库路径,如果这里没有你的库路径,那就需要增加。增加方法:

  1. 之前一直用的是
set(CMAKE_CXX_FLAGS "-Wl,--rpath=\${ORIGIN}/lib")

也就是增加查找 可执行文件当前路径下的lib文件夹,要用到的库都放在这里。

  1. 发现 CMakeLists.txt里面的 link_directories()也可以增加
set(LIB_DIR ${LIB_DIR} "./xxx/lib")
set(LIB_DIR ${LIB_DIR} "./bbb/lib")
link_directories(${LIB_DIR})

这种就可以增加多个目录


补充:
发现会警告link_directories需要绝对路径,可是我这里写了相对路径,可执行文件确实包含了这个相对路径。
有些工程又不允许相对路径,未明。

### 如何在运行可执行文件指定动态链接路径Linux 系统中,运行可执行文件可以使用多种方法来指定动态链接路径。以下是几种常见的方法: #### 方法一:通过环境变量 `LD_LIBRARY_PATH` 指定动态搜索路径 可以通过设置环境变量 `LD_LIBRARY_PATH` 来临或永久地添加动态的搜索路径。此方法适用于运行单个程序动态指定路径[^1]。 ```bash export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH ./executable_file ``` 上述命令将 `/path/to/library` 添加到动态的搜索路径中,并运行可执行文件 `executable_file`。 --- #### 方法二:使用 `-rpath` 编译选项指定运行动态路径 在编译阶段,可以通过 `gcc` 的 `-Wl,-rpath` 选项将动态路径嵌入到可执行文件中。这种方式使得可执行文件运行能够自动查找指定路径下的动态[^4]。 ```bash gcc -o executable_file source_file.c -L/path/to/library -lmylib -Wl,-rpath=/path/to/library ``` 上述命令将 `/path/to/library` 路径嵌入到可执行文件中,确保运行能够找到动态 `libmylib.so`。 --- #### 方法三:修改可执行文件RPATH 或 RUNPATH 如果已经生成了可执行文件,但需要更改其动态搜索路径,可以使用工具如 `chrpath` 修改 RPATH 或 RUNPATH[^2]。 ```bash chrpath -r /new/path/to/library ./executable_file ``` 上述命令将可执行文件 `executable_file` 的 RPATH 修改为 `/new/path/to/library`。 --- #### 方法四:使用配置文件 `/etc/ld.so.conf` 可以通过编辑全局配置文件 `/etc/ld.so.conf` 来添加动态的搜索路径。添加路径后,需要运行 `ldconfig` 更新缓存[^1]。 ```bash echo "/path/to/library" | sudo tee -a /etc/ld.so.conf sudo ldconfig ``` 上述命令将 `/path/to/library` 添加到全局动态搜索路径中,并更新系统缓存。 --- #### 方法五:使用 `ldd` 检查动态依赖 在运行可执行文件之前,可以使用 `ldd` 命令检查其依赖的动态是否正确加载。这有助于排查路径配置问题[^2]。 ```bash ldd ./executable_file ``` --- ### 总结 以上方法提供了不同的方式来指定动态链接路径,具体选择取决于实际需求和使用场景。例如,`LD_LIBRARY_PATH` 适合临测试,而 `-rpath` 更适合部署环境中的长期使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值