针对本菜鸟在利用petalinux交叉编译器在交叉编译OpenCv时遇到的一些坑,在此做一些经验交流,说的不对的地方请大佬指正(疯狂叠甲)
一、版本说明:
OpenCv -4.5.5(使用最新的4.8.0在cmake-gui的时候会报错)
Ubuntu - 16.04.1
Vmware:17
gcc version 7.3.1 20180314 (Linaro GCC 7.3-2018.04-rc3)
arm板:ZYNQ7020, Cortex - A9
内核挂载:nfs&mount
二、环境准备:
1)petalinux交叉编译器介绍与下载
1、petalinux介绍
Petalinux 支持 Versal、Zynq UltraScale+ MPSoC、Zynq-7000 SoC 以及 MicroBlaze,可与 Xilinx 硬件设计工具 Vivado 协同工作、大大简化了 Linux 系统的 开 发工作。具体的介绍可访Petalinux 工具网站 :https://china.xilinx.com/products/design-tools/embedded-software/petalinux-sdk.html
2、petalinux下载
https://china.xilinx.com/
安装步骤大家可以参考zdyz的教程,本人在这里就不作详细的描述了。
安装成功后可以在Ubuntu输入以下命令来验证:
sptl
PetaLinux environment set to '/home/cqs/petalinux/2018.3'
INFO: Checking free disk space
INFO: Checking installed tools
INFO: Checking installed development libraries
INFO: Checking network and other services
WARNING: No tftp server found - please refer to "PetaLinux SDK Installation Guide" for its impact and solution
arm-linux-gnueabihf-g++ -v
gcc version 7.3.1 20180314 (Linaro GCC 7.3-2018.04-rc3)
其中,WARNING是由于没有安装tftp的警告,我没有安装,但是无伤大雅。
2)安装cmake-gui:
为什么要用cmake-gui而不是直接通过cmake进行交叉编译呢?
问得好!这也是cmake-gui的意义所在,用我的理解:首先cmake-gui能够帮助你更加方便的修改你想要修改的参数;第二点就算能够更加高效的管理你的OpenCv库以及其他库。(点到为止啦)
在Ubuntu下输入:
sudo apt-get install cmake-gui #安装cmake-gui
3)下载OpenCv源码:
https://github.com/opencv 我下载的是4.5.5版本的
当然这里你可以直接在Ubuntu里clone下来,但是我用的笨办法...
将github上的源码压缩包复制粘贴到文件夹下(我选择的路径是/home/用户名/opencv-ARM):
解压:
tar -xzf opencv-4.5.5.tar.gz
创建build文件夹和install文件夹分别用于存放编译文件和安装的OpenCv:
mkdir build
mkdir install
创建完成后:
当然,大家已经可以删掉安装包了,如果确定之后不会想要重投来过。
三、编译安装(重点):
1)打开cmake-gui界面
cd build #进入build目录
cmake-gui #打开cmake-gui界面
2)选择对应路径后点击Configure
3)在Unix Makefiles下选择第四个
4)配置交叉编译器
其中,第一个注意大小写区分,一定要是大写的Linux,不然后续可能会出现奇奇怪怪的bug;
第二个选择C交叉编译工具所在的位置;
第三个选择C++交叉编译器工具所在的位置;
第四个选择交叉编译器所在路径的上一级目录,也就是到/bin这里。
点击Finsh
5)点击Configure
出现Configure done之后,在Search栏搜索PREFIX,并将改路径设置为install所在路径,然后再点击Configure。目的是将交叉编译安装的东西都放在install下。
6)点击Configure直到出现Configuring done
出现Configuring done之后点击Generate,等待Generating done,就可以关闭cmake-gui了。
7)编译及安装
在build目录下输入:
make -j8
请喝杯咖啡耐心等待直到100%
不得不感叹,绿色真是赏心悦目。然后执行make install,等待直到100%
至此,OpenCv就交叉编译成功了,在install文件目录下生成了四个文件夹。分别是bin、include、lib,share。share没用,不用管它,其他三个文件都是你交叉编译应用程序需要用到的。
其实讲到这里就差不多了,但是我在后续交叉编译应用程序的时候也遇到了很多困难,本人猜测是CMakeLists.txt写的有问题,踩过很多坑之后,终于有一版能用的CMakeLists.txt。下面我利用CMakeLists.txt文件对一个简单的opencv应用程序进行板级测试。
四、OpenCv板级测试
1)创建C++应用程序
创建一个工程文件夹(我的为优快云),进入文件夹中再创建一个用于存放交叉编译好的OpenCv库的文件夹(我的为3rdparty-arm)。将刚才install文件夹里的bin、include、lib复制粘贴到3rdparty-arm目录下。
然后在优快云目录下创建应用程序文件,CMakeLists.txt,以及需要测试的图片。
下面给出应用文件代码以及CMakeLists.txt代码。仅供参考
test.cpp:
#include<iostream>
#include</home/cqs/优快云/3rdparty-arm/include/opencv4/opencv2/core/core.hpp>
#include</home/cqs/优快云/3rdparty-arm/include/opencv4/opencv2/highgui.hpp>
#include</home/cqs/优快云/3rdparty-arm/include/opencv4/opencv2/opencv.hpp>
using namespace cv;
using namespace std;
#define Usage()\
{std::cerr<<"usage: ./showpic FILE"<<std::endl;}
int main (int argc, char* argv[])
{
if(argc !=2) Usage();
cv::Mat img_gray,img;
img=cv::imread("bus.jpg");
cvtColor(img,img_gray,COLOR_BGR2GRAY);
//cv::imshow("window",img);
//cv::imshow("Display window",img);
cv::imwrite("save.jpg",img_gray);
cv::waitKey(0);
return 0;
}
由于我的板子没配置UI所以选择利用保存的方式观察现象。
CMakeLists.txt:
cmake_minimum_required(VERSION 3.5)
project(test)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS "-pthread")
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(TOOLCHAIN_DIR "/home/cqs/petalinux/2018.3/tools/linux-i386/gcc-arm-linux-gnueabi")
#CMAKE_FIND_ROOT_PATH是-c++源码存放路径
set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})
if(NOT CMAKE_FIND_ROOT_PATH_MODE_PROGRAM)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
endif()
if(NOT CMAKE_FIND_ROOT_PATH_MODE_LIBRARY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
endif()
if(NOT CMAKE_FIND_ROOT_PATH_MODE_INCLUDE)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
endif()
if(NOT CMAKE_FIND_ROOT_PATH_MODE_PACKAGE)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
endif()
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-gnueabihf-g++)
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-linux-gnueabihf-gcc)
set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/3rdparty-arm/lib/cmake/opencv4)
find_package(OpenCV 4 REQUIRED)
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
include_directories($OpenCV_DIR)
set(CMAKE_C_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon")
set(CMAKE_CXX_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon")
add_executable( ${PROJECT_NAME} test.cpp )
target_link_libraries( ${PROJECT_NAME} ${OpenCV_LIBS} )
然后在优快云文件夹下依次操作:
mkdir build
cd build
cmake ..
make
成功交叉编译应用文件!
上板子测试!
问题它又又又来了,我直接告诉大家吧,码累了...这里是需要将OpenCv的动态库添加进来,如何查看test应用程序需要的动态库呢?有知道的可以在评论区打出来。
我将需要用到的动态库打包到lib3文件夹中然后拷贝到板子的/usr/lib中,然后在终端输入:
export LD_LIBRARY_PATH=/usr/lib/lib3:$LD_LIBARY_PATH
导入动态库后就可以执行应用程序test:
然后在Ubuntu的nfs目录即可查看最终结果。
下班!