目录
sudo ln -s用法
假设你有一个文件 /path/to/original_file
并希望创建一个符号链接 /path/to/link
指向这个文件,你可以使用以下命令:
sudo ln -s /path/to/original_file /path/to/link
报错error while loading shared libraries: libavdevice.so.61:
error while loading shared libraries: libavdevice.so.61: cannot open shared object file: No such file or directory
解决方法:
1 find /usr -name 'libavdevice.so*'
2 把真实文件/usr/local/ffmpeg/lib/libavdevice.so.61 创建快捷方式 /usr/lib/libavdevice.so.61
sudo ln -s /usr/local/ffmpeg/lib/libavdevice.so.61 /usr/lib/libavdevice.so.61
error while loading shared libraries: ../../lib/libopencv_core.so
原文:error while loading shared libraries: ../../lib/libopencv_core.so的解决方法-自由人_SZ-ChinaUnix博客
最近做OpenCV的交叉编译,参考了国内某大大的博客之后,成功编译出动态库文件,但运行时总是报错:
/rom/data/avt/test/cardetect/testso: error while loading shared libraries: ../../lib/libopencv_core.so: cannot open shared object file: No such file or directory
分析认为是运行时libopencv_highgui.so和libopencv_objdetect.so链接../../lib/libopencv_core.so时找不到库文件造成的。问题就出在libopencv_core.so前面奇怪的"../../lib/"相对路径。用readelf -d查看libopencv_highgui.so文件信息:
点击(此处)折叠或打开
- readelf -d libopencv_highgui.so
- Dynamic section at offset 0x50580 contains 30 entries:
- Tag Type Name/Value
- 0x00000001 (NEEDED) Shared library: [../../lib/libopencv_core.so]
- 0x00000001 (NEEDED) Shared library: [../../lib/libopencv_imgproc.so]
- 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: [libc.so.6]
- 0x0000000c (INIT) 0xa410
- 0x0000000d (FINI) 0x49ed4
- 0x00000019 (INIT_ARRAY) 0x50000
- 0x0000001b (INIT_ARRAYSZ) 12 (bytes)
- 0x0000001a (FINI_ARRAY) 0x5000c
- ......
果然libopencv_highgui.so链接core库的时候把../../lib也加上去了。
我研究了半天也没找到这个路径是在哪里可以设置的,突然想到,google上国外友人似乎很少遇到这个问题。于是按照这篇文章又重编了opencv:
http://processors.wiki.ti.com/index.php/Building_OpenCV_for_ARM_Cortex-A8
其中编译过程中需要在toolchain.cmake中增加一项配置:
点击(此处)折叠或打开
- set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
否则cmake会从root path中寻找make和gcc\g++使用,这会产生类似expect ")"的错误信息。
之后按照步骤编译出动态库,再用readelf查看一下:
点击(此处)折叠或打开
- readelf -d libopencv_objdetect.so
- Dynamic section at offset 0x107628 contains 35 entries:
- Tag Type Name/Value
- 0x00000001 (NEEDED) Shared library: [libopencv_core.so.2.4]
- 0x00000001 (NEEDED) Shared library: [libopencv_imgproc.so.2.4]
- 0x00000001 (NEEDED) Shared library: [libopencv_highgui.so.2.4]
- 0x00000001 (NEEDED) Shared library: [libdl.so.2]
- 0x00000001 (NEEDED) Shared library: [libpthread.so.0]
- 0x00000001 (NEEDED) Shared library: [librt.so.1]
- 0x00000001 (NEEDED) Shared library: [libstdc++.so.6]
- .........
这样放到arm下面运行,就会从当前目录下正确的找到core库了。