cmake 交叉编译_海思3516dv300交叉编译工具链编译opencv343

系统:虚拟机ubuntu16.04

参考大牛贴:

https://blog.csdn.net/avideointerfaces/article/details/89477828

我基本上都是按照这位老师的帖子进行的,大部分都一样,中间遇到了一些问题,因此自己记录下来。

1、 下载

下载opencv343,opencv343-contrib

wget -O opencv-3.4.3.zip https://github.com/Itseez/opencv/archive/3.4.3.zip

wget-O opencv_contrib-3.4.1.zip https://github.com/Itseez/opencv_contrib/archive/3.4.1.zip

unzip opencv-3.4.3.zip

unzip opencv_contrib-3.4.1.zip

2、 安装cmake和cmake-gui

apt install cmake cmake-gui –y

3、 使用cmake-gui生成编译文件,主要是generate之后的一些配置

  • l 执行cmake-gui,打开界面,配置如下,build路径需要自己新建:

a84c792d47b88547222af553945b8b6d.png
  • l 配置点击configure-cross com…:

0db971edd1d4a54a437b62a96793f9ab.png

Operation System --- arm-himix200-linux-gcc

gcc ---- /opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-gcc

g++ ---- /opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-g++

  • 点击finish后会configure一会直到成功
  • 修改配置选项

1) 修改CMAKE_INSTALL_PREFIX

文件夹是我自己创建的

dccf9c82af895fb690ca133f9c00006d.png

2) 添加OPENCV_EXTRA_MODULE_PATH,也就是contrib路径

a2bec86fac0637e1f3c05349bc22f955.png

3) 添加CMAKE_EXE_LINKER_FLAGS

为防止后续源代码编译错误,还得加上下面配置 -lpthread –lrt -ldl

94e3dfbed2340f66873d547873bb8a56.png

这个是参考,我这样运行时,提示了一个错误:-lrt 找不到文件或目录

所以,我直接把-lrt删除了,重新generate后make,就成功了。

I don’t know why

2a68c65cf373e0a3ac5d041eea072746.png

4) 添加ZLIB_INCLUDE_DIR

这个错误其实是我在编译的时候发现的,找不到zlib,采坑无数你懂得,所以这次就直接填上

路径: opencv-3.4.3/3rdparty/zlib

9d01621254c41b5786381258f72d91c4.png

5) 添加CMAKE_FIND_ROOT_PATH

主要是为了保险,路径

/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/

ed8d1c0c0e46a690713ed57e52121e13.png

6) 选中编译opencv_world库

aa2a12bf73d559eede8e06ae5ad737a0.png

7)配置完成后点击generate来生成可编译得opencv代码。

b6f825e6fe9cda018728d61713621087.png

4、 编译过程调试,主要是缺失文件补充和包含文件路径的修改

l 虚拟机内存和核心修改

刚装好ubuntu虚拟机的时候,使用cmake-gui都好好,后来也不知道为什么,cmake-gui开启之后整个ubuntu系统都卡死了。用free看了一下内存情况,还剩余90%的内存呢,也不知道为什么会卡死(希望有经验的同学们指导一下我~)。查了一顿资料,有增加内存容量,增加cpu个数等等。我建虚拟机的时候就是8G的内存了,所以没有增加。查了一下cpu设置的个数是宿主机的一半比较合适,我设置了8个。设置完确实好转了,特别是make –j8的时候,opencv的编译大概在5min可以完成。下面是我的虚拟机配置。

16324cd737ab028b70176b6ea9246c41.png

l make –j8开始编译

c70aa5b6833e638d016a4b1e91b11d00.png
  • 错误1 No suitable threading library available

解决方法:

vi ../opencv-3.4.3/3rdparty/protobuf/src/google/protobuf/stubs/http://common.cc

添加#Define HAVE_PTHREAD

da207d3be50df1c91ba74bcc1f8282db.png

c70aa5b6833e638d016a4b1e91b11d00.png
  • 缺失文件补充

fatal error: vgg_generated_120.i,vgg_generated_80.i,vgg_generated_40.i,vgg_generated_64.i,boostdesc_bgm.i等

25737a9d7cd432b3ea4fb1862afa0321.png

解决方法,

把确实的文件下载下来,拷贝进opencv_contrib-3.4.3/modules/xfeatures2d/src文件夹下,继续编译就好了。

缺失文件下载路径:

链接:https://pan.baidu.com/s/1-PA3ItqCCiaNUXZxIHHiIg

提取码:xlpn

修改include路径:

opencv-3.4.3/modules/stitching/include/opencv2/stitching/detail/matchers.hpp:52:42: fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory

# include "opencv2/xfeatures2d/cuda.hpp"

0aa3927c8d0ee4e033206cae9fac391e.png

20cd6ba94f1e492f225f30144e382e81.png

类似错误都是修改include路径,或者在cmaklist里面包含(这个应该是最方便的,我因为不熟没有尝试,好在报错的不多,我就一一按照错误提示修改了头文件)

20cd6ba94f1e492f225f30144e382e81.png

c70aa5b6833e638d016a4b1e91b11d00.png
  • 修改完所有的错误,make -j 编译成功
  • make install 安装成功

197e4866871d3c0353e1b84d745b2007.png

Cd lib

看到所有的库也都编译好了

760944f342f58ac7de0cc618ce07301f.png

大功告成

5、 测试

c70aa5b6833e638d016a4b1e91b11d00.png

编写一个测试demo

  • #include <iostream>
    #include <stdio.h>
    #include <opencv2/highgui.hpp>
    #include <opencv2/core.hpp>
    #include <opencv2/imgcodecs.hpp>
    using namespace cv;
    using namespace std;
    int main()
    {
    Mat image(200, 200, CV_8UC1);
    Image = 255;
    imwrite("demo.jpg", image);
    Mat im = imread("demo.jpg");
    im -=100;
    imwrite("demo1.jpg",im);
    return 0;
    }
  • 交叉编译:

arm-himix200-linux-g++ -I /home/sansa/opencv-3.4.3/install_hi3516dv300/include -L /home/sansa/opencv-3.4.3/install_hi3516dv300/lib -lopencv_world -lpthread -lrt -ldl -o demo test_opencv.cpp

  • 把生成的demo和opencv生成的lib都拷贝进nfs
  • 进入面板机系统,执行的demo程序

在执行demo程序之前,首先要添加lib的搜索路径:

Cd lib

export LD_LIBRARY_PATH="$PWD:$LD_LIBRARY_PATH"

./demo

运行成功

我编译好的opencv:

zip文件是官网下载好的源码,没有做任何修改

加压后的文件是我在编译过程中修改好的

984aa12ae487ec4211123c8e1b02cc57.png

链接:https://pan.baidu.com/s/19_WxuMVk3odXbM3dIVzVbQ

提取码:ca7x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本资源为arm-linux下的海思编译工具V300 C语言有三种标准库如下: 1.Glibc glibc = GNU C Library 是GNU项(GNU Project)目,所实现的 C语言标准库(C standard library)。 目前,常见的桌面和服务器中的GNU/Linux类的系统中,都是用的这套C语言标准库。 其实现了常见的C库的函数,支持很多种系统平台,功能很全,但是也相对比较臃肿和庞大。 2.uClibc 一个小型的C语言标准库,主要用于嵌入式。 其最开始设计用于uClinux(注:uClinux不支持MMU),因此比较适用于微处理器中。 对应的,此处的u意思是μ,Micro,微小的意思。 uClibc的特点: (1)uClibc比glibc要小很多。 (2)uClibc是独立的,为了应用于嵌入式系统中,完全重新实现出来的。和glibc在源码结构和二进制上,都不兼容。 3.EGLIBC EGLIBC = Embedded GLIBC EGLIBC是,(后来)glibc的原创作组织FSF所(新)推出的,glibc的一种变体,目的在于将glibc用于嵌入式系统。 EGLIBC的目标是: (1)保持源码和二进制级别的兼容于Glibc 源代码架构和ABI层面兼容 如果真正实现了这个目标,那意味着,你之前用glibc编译的程序,可以直接用eglibc替换,而不需要重新编译。 这样就可以复用之前的很多的程序了。 (2)降低(内存)资源占用/消耗 (3)使更多的模块为可配置的(以实现按需裁剪不需要的模块) (4)提高对于交叉编译(cross-compilation)和交叉测试(cross-testing)的支持 【目前了解到的海思交叉编译工具的应用环境】 arm-hisiv100-linux为基于uclibc的工具,arm-hisiv200-linux 为基于 glibc 的工具; arm-hisiv300-linux为基于uclibc的工具,arm-hisiv400-linux 为基于 glibc 的工具; arm-hisiv500-linux为基于uclibc的工具,arm-hisiv600-linux 为基于 glibc 的工具。 (在开发的时候,你编译内核所用的交叉编译跟用户的应用程序所用的交叉编译一定需要相同,不然没法调用系统内核的依赖库)   其中eglibc这种很容易被人开发者忽视,从而选错了编译工具。 uClibc和Glibc并不相同,两者有许多不同之处,有可能给你带来一些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值