运行可执行文件时候报找不到动态库
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 就是运行时加载库路径,如果这里没有你的库路径,那就需要增加。增加方法:
- 之前一直用的是
set(CMAKE_CXX_FLAGS "-Wl,--rpath=\${ORIGIN}/lib")
也就是增加查找 可执行文件当前路径下的lib文件夹,要用到的库都放在这里。
- 发现 CMakeLists.txt里面的 link_directories()也可以增加
set(LIB_DIR ${LIB_DIR} "./xxx/lib")
set(LIB_DIR ${LIB_DIR} "./bbb/lib")
link_directories(${LIB_DIR})
这种就可以增加多个目录
补充:
发现会警告link_directories需要绝对路径,可是我这里写了相对路径,可执行文件确实包含了这个相对路径。
有些工程又不允许相对路径,未明。