文章目录
- 交叉编译的概念
- 机器(交叉编译链)选择
- opencv的交叉编译
- QT交叉编译
- 如何使用?
- 总结
前言:我手里的pi性能太低了,安装PCL一编译磁盘就装满,在反复撞墙3次后,我终于接受了安装不了的事实。原来嵌入式开发中常用到交叉编译。我也来(硬着头皮)试试,deadline已经赶不上了,只能先装个死,然后继续配置环境。
但是配置pcl的时候,发现没有教程,本来想按照编译opencv的方式编译pcl结果遇到了一些依赖库已经安装但是cmake依然找不到库的情况,然后pcl就暂时搁置了,毕竟时间成本太高,这里只完成了配置opencv的部分。
交叉编译的概念
在机器A上编译出在机器B上运行的程序或者库,这个程序和库不能在A上运行。通常机器A的性能比机器B好很多。
机器(交叉编译链)选择
我在笔记本上装了虚拟机,安装Ubuntu18.04并且根据该Nano Pi 的操作手册安装了交叉编译链。
git clone https://github.com/friendlyarm/prebuilts.git -b master --depth 1
cd prebuilts/gcc-x64
cat toolchain-6.4-aarch64.tar.gz* | sudo tar xz -C /
export PATH=/opt/FriendlyARM/toolchain/6.4-aarch64/bin:$PATH
export GCC_COLORS=auto
. ~/.bashrc
就完事了。
测试hello world
在虚拟机上编译好不能运行:
在NanoPi上运行:
opencv的交叉编译
安装依赖项
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev
官网下载opencv源代码,并解压
在解压后的目录
mkdir build
cmake-gui //进入cmake界面
选择好source(解压目录)和build目录(mkdir的那个build),然后configure,选择交叉编译
根据自己的交叉编译链设置
比如我的交叉编译链安装在:/opt/FriendlyARM/toolchain/6.4-aarch64/bin,以下C、C++和targetRoot的设置就需要按照这个路径填写
finish,然后再search中搜索install, 选择自己希望安装得目录
然后再次configure并且generate,关闭cmake,然后make -j4, sudo make install
即可
在make的时候遇到错误undefined reference to `png_init_filter_functions_neon’参考解决
我是就遇到这一个问题,解决后一路通畅
设置opencv的环境变量
将OpenCV库添加到路径
sudo gedit /etc/ld.so.conf.d/opencv.conf
末尾添加:/usr/local/lib
保存退出
sudo ldconfig
配置生效
配置bash,在bash.bashrc文件的末尾添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
然后使设置生效:
source /etc/bash.bashrc
sudo updatedb
以上opencv交叉编译完成
QT交叉编译
QT交叉编译主要是为了QT creator上配置arm交叉编译环境。可以先按照一般的QT安装模式将QT安装好,然后参考:
编译QT的交叉编译库并给qtcreator设置编译器
如何使用?
假设QTcreator 的编译器选择好了(也就是上个部分),在.pro文件中设置好动态链接库的目录就可以了,和普通的opencv的使用是一样的。
INCLUDEPATH=/home/vera/lib_opencv_dir/include \
/home/vera/lib_opencv_dir/include/opencv \
/home/vera/lib_opencv_dir/include/opencv2
LIBS=/home/vera/lib_opencv_dir/lib/libopencv_calib3d.so \
/home/vera/lib_opencv_dir/lib/libopencv_core.so \
/home/vera/lib_opencv_dir/lib/libopencv_highgui.so \
/home/vera/lib_opencv_dir/lib/libopencv_imgproc.so \
/home/vera/lib_opencv_dir/lib/libopencv_imgcodecs.so\
/home/vera/lib_opencv_dir/lib/libopencv_objdetect.so\
/home/vera/lib_opencv_dir/lib/libopencv_photo.so \
/home/vera/lib_opencv_dir/lib/libopencv_dnn.so \
/home/vera/lib_opencv_dir/lib/libopencv_shape.so\
/home/vera/lib_opencv_dir/lib/libopencv_features2d.so \
/home/vera/lib_opencv_dir/lib/libopencv_stitching.so \
/home/vera/lib_opencv_dir/lib/libopencv_flann.so\
/home/vera/lib_opencv_dir/lib/libopencv_videoio.so \
/home/vera/lib_opencv_dir/lib/libopencv_video.so\
/home/vera/lib_opencv_dir/lib/libopencv_videostab.so \
/home/vera/lib_opencv_dir/lib/libopencv_ml.so
测试代码:
#include <iostream>
#include<opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat img_input;
img_input =imread("dog.JPG");
cout << "Hello World!" << endl;
if(!img_input.empty())
{
cout<<"image input successed";
Mat gray;
cvtColor(img_input,gray,COLOR_RGB2GRAY);
cout<<"image to gray"<<endl;
Rect rect(0,0,100,200);
Mat lgray=gray(rect);
cout<<"cut gray"<<endl;
}
else
cout<<"the image is empty";
return 0;
}
唯一不同的点是,在虚拟机上没有办法运行,但是如果有错误的话会报错,没有错误的话,qt显示是这样的
在NeoPi上运行时,需要拷贝相应的动态链接库(如何版本一样的话就不需要拷贝了),输出为:
总结
需要在计算机上安装以及配置路径:
- 虚拟机,Ubuntu18.04
- 对应arm的交叉编译链
- 交叉编译opencv
- 交叉编译QT库
移植程序的时候,需要注意opencv版本的一致,如果不一致,将交叉编译出的opencv的动态链接库 copy过去,并且在/etc/ld.so.conf.d
中添加一个.conf
文件写入你copy过去的库的位置,保存(这样运行可执行程序就可以直接找到自己需要的链接库了)。
以上。