接着前面一篇博客的内容,继续做验证性实验。
1. 这里换种方式,不同于我前面博客,这里使用cmake-gui方式编译opencv。
(1)由于想要WITH_QT编译,所以这里先安装下QT库
Ubuntu16.04系统下静态库.a和动态库.so文件的生成及使用_boomboomy的博客-CSDN博客
Linux中./configure和cmake的区别是什么? - 知乎
不同于前面的博客,博主这次采用源码安装方式来安装qt, 网址 下载qt源码,博主解压缩到了home目录下
首先在终端下执行命令,安装一些必要库
sudo aptitude build-dep qt5-default
注意如下命令,博主实验下来的必须使用
sudo apt install libxcb*-dev libx11-xcb-dev
然后可以打开目录下的README文件,查看需要的前提配置需求,根据此准备好即可。博主在目录下新建了一个build文件夹(这样编译的文件都在此文件夹下,便于管理),一个install文件夹。 cd到build目录下执行如下命令,将qt安装到如下目录下(/home/sxhlvye/qt-everywhere-src-5.15.2/install)
../configure -prefix /home/sxhlvye/qt-everywhere-src-5.15.2/install -opensource
可以看到build目录下已经生成了makefile文件
同时也看到这个目录( /home/sxhlvye/qt-everywhere-src-5.15.2)下并没有cmakefiles文件,只有./configure文件,待上面configure命令完毕后,再输入 sudo make -j4,耐心等待完成
最后执行make install,可以看到install目录下有如下文件夹
这是install\plugins\platforms下的文件内容
添加如下环境变量(在~/.bashrc中加入)
可看到生效语句使用后,系统能找到qmake了
同时也验证了whereis只能在系统的环境配置目录下去找某个库,若放到别的位置也找不到。
下面用命令行方式编译一个简单的qt程序
博主在如上目录结构下创建一个helloqt.cpp文件,文件中代码如下:
#include
#include
int main(int argc,char **argv)
{
QApplication a(argc,argv);
QLabel label(QLabel::tr("Helle Qt!"));
label.show();
return a.exec();
}
命令行cd到helloqt.cpp所在目录下,分别执行如下命令语句:
qmake -project
修改生成的test_qt.pro为如下(添加了一条QT += widgets语句):
再执行
qmake test_qt.pro
最后再执行
make
运行可执行文件,可以看到如下窗口
sudo ./test_qt
这里说明一下,如果前面没有提前安装说明的库libxcb*-dev,libx11-xcb-dev,到这一步时会报如下错误:
同时也可以看到不提前安装libxcb*-dev,libx11-xcb-dev,install\plugins\platforms下的文件内容是这样的,缺少了一个libqxcb.so库
ubuntu 18.04 - QT "Could not find the Qt platform plugin "xcb" " - Stack Overflow
ubuntu下QT版本切换_dzhongjie的博客-CSDN博客_ubuntu切换qt版本
ubuntu16.04下qt4和qt5同时安装的切换_lch_vision的博客-CSDN博客_qt4和qt5可以一起安装吗
(2)下面开始进入opencv的 带WITH_QT源码编译过程。
通过cmake-gui来进行编译,这里不多细讲,参见我前面博客,只是在这篇博客中当时用的是交叉编译器,但方式类似。这里我选择编译的是动态链接库,且WITH_QT勾选上了,配置路径就用上了前面刚源码编译好的qt库
还是那些方法,sudu make -j4, make install.完毕后,在~/.bashrc中加入了pkg-config的目录
前面博客 中提到pkg-config是个好东西,这里看下上面pkgconfig目录下是什么文件,原本是opencv.pc,这里被我重新命名为了opencv_share.pc(这次编译采用的是动态编译,后面博主还会采用静态编译再做一次,为了区分下,所以取了一个叫opencv_share.pc的名字)
里面的Name:原本是OpenCV,这里被我更改为了OpenCV_share
完毕后,还是拿前面博客里的example.cpp例子来做测试。
#include
#include
#include
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("/usr/108.bmp");
std::cout << "read ok" << std::endl;
imshow("image", img);
waitKey(0);
return 0;
}
在终端中输入如下命令语句,然后运行生成的文件的时候报错
g++ example.cpp -o example1.out $(pkg-config --cflags --libs opencv_share) -lpthread -lrt -ldl
这里是找不到动态链接库的路径,所有这里还得在~/.bashrc中加入下面红色线标记处语句,添加一个新的环境变量
可以看到此目录下有很多需要依赖的动态链接库
通过环境变量指定后,程序能够正确执行。
注:这里如果不想通过环境变量指定查找路径方式,还可以直接把动态库拷贝到example1.out的所在目录,类似于博主Ubuntu下的基本知识点(一)_jiugeshao的专栏-CSDN博客里面的第四点。这里实验下,去除之前添加的环境变量后,将和opencv相关的动态链接库so文件都拷贝过来,可以发现程序也能正确运行。
博主又实验了如下命令行语句,也能正确编译example.cpp文件
g++ example.cpp -o example1.out -I/home/sxhlvye/opencv-3.4.0/install_share/include/opencv -I/home/sxhlvye/opencv-3.4.0/install_share/include -L/home/sxhlvye/opencv-3.4.0/install_share/lib -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core -lpthread -lrt -ldl
呼应前面博客说的,编译文件可以采用IDE方式,也可以直接命令行,命令行方式也可以细分用pkg-config方式,还是通过gcc的参数命令 -I 和-L去指定。
g++ -L 和-l && -I参数_xianyoudianxueyuan的专栏-CSDN博客
快速指南:pkg-config 的原理和使用方法_程序猿视角-CSDN博客_pkg-config
pkg-config的用法及库搜索路径设置_hunanchenxingyu的专栏-CSDN博客_pkg-config 路径