因为opencv4和很多程序不兼容,比如它成了我搭建caffe的最大绊脚石,然后导致我的openpose也没法运行(依托了caffe框架)
所以今天就把它卸载,原来nano自带opencv4.1.1,这次我装的是opencv3.4.10。
方法:参考https://www.cnblogs.com/qilai/p/13663484.html
sudo apt-get purge libopencv*
sudo apt autoremove
sudo apt-get update
百度就可以解决
pkg-config opencv --modversion
没有显示
或者opencv_version没有正常显示,应该就是卸载完毕。
不过我在查资料时,有位前辈的csdn上说不必把文件全部手动清理干净,安装新版本时会将其覆盖掉。
根据linux系统特点,卸载一个软件其实就是把它的安装包删掉。所以应该不必过多担心。
由于Jetson nano 的特殊性,所以呢还是查找在Jetson nano ubuntu18.04上安装的办法比较稳妥~~~
甩链接:
https://github.com/shotantan/how_to_compile_opencv3_on_jetson_nano
官方源码:
https://github.com/opencv/
opencv3.4.10
https://github.com/opencv/opencv/tree/3.4.10
opencv_contirb
https://github.com/opencv/opencv_contrib/tree/3.4.10
二者一定要相互匹配哦!
再附一个安装opencv3.4.8的自动安装shell
https://github.com/jkjung-avt/jetson_nano/blob/master/install_opencv-3.4.8.sh
需要自取!
还有一份参考,但是无奈作者给的链接失效了
https://blog.csdn.net/wup422457601/article/details/113087266?spm=1001.2014.3001.5501
pkg-config opencv --modversion
提示把opencv.pc添加到路径
解决:
按照gihub上的方法下载完后,会在build文件下自动生成opencv.pc文件,找到它,
可以通过在build目录下
执行
find / -iname "opencv.pc"
找到
之后执行
sudo cp 路径 /usr/local/lib/pkgconfig
这样再次输入命令就可以查看版本号啦!
如何使得刚刚安装的opencv3.4.10在python下得到支持呢?
我在自己的python3.6环境下,
执行
sudo apt install python3-opencv
python
import cv2
print(cv2.__version__)
4.5.1
opencv的 make太长时间了,就没有再重新对cmake进行设置重新编译
,参考:
https://blog.csdn.net/avideointerfaces/article/details/104830723
静态库的名字一般是libxxx.a 在编译的时候直接编译进可执行文件中,运行环境中可以不用存在库文件,但是如果库文件更新了,可执行文件需要重新编译。
操作静态库
Linux下使用ar命令进行操作静态库:
ar archivefile objfile
archivefile:archivefile是静态库的名称
objfile: objfile是已.o为扩展名的中间目标文件名,可以多个并列
参数 意义
-r 将objfile文件插入静态库尾或者替换静态库中同名文件
-x 从静态库文件中抽取文件objfile
-t 打印静态库的成员文件列表
-d 从静态库中删除文件objfile
-s 重置静态库文件索引
-v 创建文件冗余信息
-c 创建静态库文件
编译静态库
在编译成静态库之前,我们需要将源文件编译一下,生成一个 .o 文件的目标文件。例如写了一个打印helloworld的接口,我们要先执行:
gcc -c hello.c
ar crv libhello.a hello.o
第一条命令是生成目标文件hello.o ,第二条命令是将目标文件hello.o 打包成静态库文件libhello.a。
链接静态库
上面我们说了静态库是如何生成的,然后我们说一下静态库怎么使用。静态库是要编译进可执行文件的,在程序运行的环境中,并不需要静态库的存在。比如我们生成的静态库文件是libhello.a 需要编译的文件是main.c。编译命令如下:
gcc main.c -L . -lhello
解读一下: -L 后面是静态库文件所在的目录,我这里 . 就是指当前目录的意思。也就是库文件就和源文件在同一路径。真正编译的时候,这个路径还是要填绝对路径要好,这个需要注意一下。后面的-l加上库名,这个库名是去掉lib和后面的.a。静态库的链接就是这样的。
动态库
动态库中的代码是可执行文件在运行中加载执行的,也就是说 程序运行环境中要有动态库文件。一般动态库文件命名为lib*.so**。动态库的优点就是方便升级,动态库变化了,可执行文件不用重新编译。
编译动态库
还拿hello.c来说,使用下面的命令就可以生成一个动态库文件libhello.so 。看一下各个参数的含义。
gcc -fPIC -shared -o libhello.so hello.c
-fPIC 是创建与地址无关的编译程序(pic,position independent code),是为了能够在多个应用程序间共享。-shared指定生成动态链接库。
调用动态库态库
**我们在运行环境中直接运行可执行文件,前提动态库文件也在运行环境中。**需要注意的是 系统在运行程序的时候,需要知道动态库的名称和位置,这样才能加载,如果找不到动态库就会直接程序退出报错。
所以在编译程序的时候使用下面方式编译:
gcc mian.c -o mian -L ./ -lhello
同样,-L后面是库文件的路径,最好是用绝对路径。-l加上去掉lib的库名。然后直接执行可执行文件就可以了。
还用一种使用动态库的方式是:
linux提供dlopen、dlsym、dlerror和dlcolose函数获取动态链接库的函数。通过这个四个函数可以实现一个插件程序,方便程序的扩展和维护。函数格式如下所示:
#include
void *dlopen(const char *filename, int flag);
char *dlerror(void);
void *dlsym(void *handle, const char *symbol);
int dlclose(void *handle);
Link with -ldl.
就是使用这些函数去找对应的库函数入口地址,然后去执行。
这里有很多解决办法,但是不适用于我。。。
https://xbuba.com/questions/30475415
解决之后再来更新~~~~~~~~~~~~~~~~~~~~~~~~
2021.4.26
小tip:以后筛选资料还是看nano的为主~