Opencv 交叉编译
opencv的交叉编译
![opencv的交叉编译](https://img.taocdn.com/s3/m/c195ba5b49d7c1c708a1284ac850ad02df80077f.png)
opencv的交叉编译(实用版)目录1.OpenCV 简介2.交叉编译的概念与作用3.OpenCV 的交叉编译流程4.交叉编译 OpenCV 的实践方法与技巧5.总结正文1.OpenCV 简介OpenCV(Open Source Computer Vision Library,开源计算机视觉库)是一个开源的计算机视觉和机器学习软件库。
它包含了大量的图像处理、视频分析和计算机视觉方面的功能。
OpenCV 适用于各种操作系统,如 Windows、Linux 和 Mac OS 等,并且支持多种编程语言,如 C++、Python 和 Java 等。
2.交叉编译的概念与作用交叉编译是指在一个平台上编译得到另一个平台上可执行的代码。
例如,在 Windows 平台上编译得到 Linux 平台上可执行的代码。
交叉编译的作用主要体现在以下几点:(1)满足不同平台用户的需求:通过交叉编译,可以让一个软件在不同的操作系统上都能运行。
(2)降低开发成本:交叉编译可以减少在不同平台上进行开发的工作量,提高开发效率。
(3)提高软件的可移植性:交叉编译可以使软件更容易在不同的硬件和操作系统上进行迁移。
3.OpenCV 的交叉编译流程OpenCV 的交叉编译流程主要包括以下几个步骤:(1)准备编译环境:首先需要安装交叉编译所需的工具链,例如在Windows 平台上编译 Linux 可执行文件,需要安装 Linux 的交叉编译工具链。
(2)下载 OpenCV 源码:从 OpenCV 的官方网站下载相应的源代码。
(3)配置编译选项:根据目标平台的需求,设置编译选项,例如指定编译器、链接器和目标安装路径等。
(4)编译 OpenCV:使用交叉编译工具链编译 OpenCV 源码。
(5)安装 OpenCV:将编译好的 OpenCV 安装到目标平台上。
4.交叉编译 OpenCV 的实践方法与技巧(1)选择合适的交叉编译工具链:根据目标平台的架构(如 x86 或ARM)选择合适的交叉编译工具链。
opencv ffmpeg 交叉编译
![opencv ffmpeg 交叉编译](https://img.taocdn.com/s3/m/75f5801aeffdc8d376eeaeaad1f34693dbef1051.png)
opencv ffmpeg 交叉编译OpenCV和FFmpeg是两个常用的图像处理和视频处理的库。
它们可以帮助我们实现各种各样的应用。
本文将介绍如何对它们进行交叉编译。
首先,需要准备好交叉编译工具链。
这里我们以arm-linux-gnueabi为例。
在Ubuntu下,可以使用以下命令进行安装:```sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi```接下来,我们需要下载OpenCV和FFmpeg的源码。
可以从它们的官方网站上下载最新的版本。
下载完成后,将它们解压缩到任意目录下。
然后,进入OpenCV的源码目录,创建一个名为"build"的子目录,并进入该目录。
执行以下命令:```cmake \-DCMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake \-DCMAKE_INSTALL_PREFIX=install \-DCMAKE_C_FLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=hard" \-DCMAKE_CXX_FLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=hard" \-DWITH_CUDA=OFF \-DBUILD_DOCS=OFF \-DBUILD_TESTS=OFF \-DBUILD_PERF_TESTS=OFF \-DBUILD_EXAMPLES=OFF \-DBUILD_ANDROID_EXAMPLES=OFF \-DWITH_FFMPEG=OFF \-DWITH_GSTREAMER=OFF \-DWITH_TBB=OFF \-DWITH_EIGEN=OFF \-DWITH_QT=OFF \-DWITH_VTK=OFF \-DWITH_IPP=OFF \-DWITH_OPENCL=OFF \-DWITH_OPENCL_SVM=OFF \../```该命令会使用指定的工具链进行编译,并将结果安装到"install"目录下。
opencv移植到arm详细过程
![opencv移植到arm详细过程](https://img.taocdn.com/s3/m/3b2d9580a0116c175e0e4801.png)
Opencv-2.1.0 的arm移植我的环境Host:Ubuntu 14.04Target:tq2410 with Linux 2.6.30.4Crossing Compiler:arm-linux-gcc 4.3.2一交叉编译链的安装1# cd /usr/local解压,即可得到arm-none-linux-gnueabi 目录# tar xzvf arm-none-linux-gnueabi-4.3.2.tgz -C ./2 编辑/etc/bash.bashrc文件添加把编译器路径到环境变量PA TH中,只要在这个文件中添加下面这2 个语句即可:PATH=/usr/local/arm/4.3.2/bin:$PA THexport PA TH3 编辑完毕后使用source /etc/bash.bashrc 命令执行以下这个文件,让设置生效,之后再输入:# arm-none-linux-gnueabi-gcc -v如果输出下面的信息则表面设置成功:Using built-in specs.Target: arm-none-linux-gnueabiConfigured with:/scratch/julian/lite-respin/linux/src/gcc-4.3/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --enable-shared --enable-symvers=gnu--enable-__cxa_atexit --with-pkgversion='Sourcery G++ Lite 2008q3-72' --with-bugurl=https:///GNUToolchain/--disable-nls--prefix=/opt/codesourcery--with-sysroot=/opt/codesourcery/arm-none-linux-gnu eabi/libc--with-build-sysroot=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/libc--with-gmp=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-none-linux-gnueabi-i686-p c-linux-gnu/usr--with-mpfr=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-non e-linux-gnueabi-i686-pc-linux-gnu/usr--disable-libgomp--enable-poison-system-directories--with-build-time-tools=/scratch/julian/lit e-respin/linux/install/arm-none-linux-gnueabi/ bin --with-build-time-tools=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/bin Thread model: posixgcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)但是,此时会报错:bash:/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc:没有那个文件或目录这是因为是为62位机与32位不兼容,在64位ubuntu系统上运行32位程序需要安装32位lib网上很多地方说用#sudo apt-get install ia32-libs可解决,但是我执行之后却显示:# sudo apt-get install ia32-libs正在读取软件包列表... 完成正在分析软件包的依赖关系树正在读取状态信息... 完成正在读取软件包列表... 完成正在分析软件包的依赖关系树正在读取状态信息... 完成现在没有可用的软件包ia32-libs,但是它被其它的软件包引用了。
opencv 交叉编译方法
![opencv 交叉编译方法](https://img.taocdn.com/s3/m/ad4bfdd64bfe04a1b0717fd5360cba1aa8118c10.png)
OpenCV 交叉编译方法OpenCV是一个开源的计算机视觉库,广泛应用于图像处理和计算机视觉领域。
在某些情况下,我们可能需要将OpenCV库进行交叉编译,以在不同的平台或系统上使用。
本文将介绍OpenCV交叉编译的基本概念、方法和步骤。
什么是交叉编译交叉编译是指在一台主机上生成目标平台可执行文件的过程。
通常情况下,主机和目标平台具有不同的硬件架构、操作系统或工具链。
通过交叉编译,我们可以在一台主机上开发和构建针对目标平台的应用程序。
为什么要进行交叉编译进行交叉编译有以下几个优点:1.节省时间:通过在高性能主机上进行编译,可以加快构建过程。
2.节省资源:避免在目标平台上安装开发环境和依赖项。
3.跨平台支持:通过交叉编译,可以轻松地将应用程序移植到不同的硬件架构或操作系统上。
OpenCV交叉编译步骤步骤1:准备工作在开始交叉编译之前,我们需要准备一些工具和环境:1.目标平台的交叉编译工具链:这是一套特定于目标平台的编译器、链接器和库文件。
你可以从目标平台的官方网站或开发者社区获取。
2.主机系统上的OpenCV源代码:你可以从OpenCV官方网站下载最新的源代码。
3.交叉编译环境:在主机系统上安装支持交叉编译的工具和库。
步骤2:配置交叉编译环境在开始交叉编译之前,我们需要设置一些环境变量:export PATH=<path-to-cross-compiler-tools>:${PATH}export CC=<cross-compiler-prefix>-gccexport CXX=<cross-compiler-prefix>-g++export AR=<cross-compiler-prefix>-arexport LD=<cross-compiler-prefix>-ldexport CROSS_COMPILE=<cross-compiler-prefix>-其中,<path-to-cross-compiler-tools>是你安装交叉编译工具链的路径,<cross-compiler-prefix>是你的交叉编译工具链前缀。
opencv python交叉编译
![opencv python交叉编译](https://img.taocdn.com/s3/m/0acbf0270a1c59eef8c75fbfc77da26924c5967b.png)
标题:OpenCV Python交叉编译指南一、背景介绍OpenCV是一个开源的计算机视觉库,它可以帮助开发者快速构建图像处理和计算机视觉相关的应用程序。
而Python是一种简洁、易读的高级编程语言,在人工智能和数据科学领域有着广泛的应用。
将OpenCV与Python结合起来可以为图像处理和计算机视觉领域的开发提供便利。
然而,在一些特定的场景下,我们可能需要将OpenCV在其他评台上进行交叉编译,比如在嵌入式系统、嵌入式Linux等环境中使用OpenCV和Python。
在这篇文章中,我们将介绍如何在Linux评台上进行OpenCV Python交叉编译的详细步骤和注意事项。
二、交叉编译准备工作1. 确定目标评台在进行交叉编译之前,首先需要确定目标评台的硬件架构和操作系统版本。
我们可能要将OpenCV和Python在ARM架构的嵌入式系统上进行交叉编译,因此需要了解该嵌入式系统的架构和操作系统版本。
2. 安装交叉编译工具链根据目标评台的架构和操作系统版本,安装对应的交叉编译工具链。
交叉编译工具链包括交叉编译器、交叉信息器等工具,它们可以将源代码编译成目标评台的二进制可执行文件。
3. 准备交叉编译环境在本地机器上搭建交叉编译环境,包括配置交叉编译工具链的环境变量、安装目标评台的头文件和库文件等。
三、交叉编译OpenCV1. 下载OpenCV源代码从OpenCV官方全球信息湾或GitHub上下载最新的OpenCV源代码,并解压到本地机器上。
2. 配置交叉编译参数在终端中进入OpenCV源代码目录,运行以下命令配置OpenCV的交叉编译参数:```cmake -DCMAKE_C_COMPILER=交叉编译器路径-DCMAKE_CXX_COMPILER=交叉编译器路径-DCMAKE_FIND_ROOT_PATH=交叉编译环境路径-DOPENCV_EXTRA_MODULES_PATH=OpenCV额外模块路径 -DOPENCV_ENABLE_NONFREE=ON/OFF-DBUILD_opencv_python2=OFF-DBUILD_opencv_python3=ON-DPYTHON3_EXECUTABLE=Python解释器路径-DCMAKE_INSTALL_PREFIX=OpenCV安装路径```这些参数中,需要根据实际情况填写交叉编译器路径、交叉编译环境路径、OpenCV额外模块路径、Python解释器路径和OpenCV安装路径。
基于ZYNQ7000的交叉编译工具链QtOpenCVffmpeg等库支持总结
![基于ZYNQ7000的交叉编译工具链QtOpenCVffmpeg等库支持总结](https://img.taocdn.com/s3/m/07cd6d739a6648d7c1c708a1284ac850ad020465.png)
基于ZYNQ7000的交叉编译工具链Qt+OpenCV+ffmpeg等库支持总结最近刚刚接触XILINX的ZYNQ板,刚接触没有十天。
XILINX定位它为SOC,我也很认同,起码比TI定位MPU 为SOC强很多。
据说今年TI的最新产品也加入了ZYNQ板。
之前的MIPS处理器设计与实现的项目就算做告一段落,搞了将近7个月,成果显著,收获颇多,最近打算搞搞ZYNQ。
之前MIPS也有一套交叉编译工具,不过是老师提供的,自己也尝试搞了搞,太辛苦了,而且也没什么成果,因为我们需要LITE版的MIPS指令集。
这次不一样,ZYNQ集成了两个ARM cortex-A9处理器,可以支持thumb指令集以及arm指令集,所以这方面的交叉编译我本以为会很容易,谁知道依旧搞了很久。
主机平台:Ubuntu12.04LTS x86-32bit(我装的是双系统,没有在虚拟机下运行,真心不推荐在虚拟机下运行,太慢了)目标平台:linaro(Ubuntu11.04貌似)ARM(Xilinx Zedboard)由于OpenCV默认下只支持A VI标准格式的打开与写入,因此需要添加很多解码与编码库的交叉编译库等文件,包括jpeg、png等等。
因此,大体流程是先对需要支持的库进行交叉编译,再对OpenCV进行交叉编译并添加相应的库支持。
依赖关系如下:OpenCV|--------zlib|--------jpeg|--------libpng|--------zlib|--------TIff|--------zlib|--------ffmpeg|--------x264|--------xvidcore其实,看起来并不难,但最难的就是这些源码包之间的相互支持等错综复杂的关系,基本上就是错一个动全身,笔者经过了几番的尝试,终于找到了一个在当前环境下可以成功的源码包,其版本如下:xilinx-arm交叉编译工具:xilinx-2011.09-50-arm-xilinx-linux-gnueabi.binffmpeg源码包:ffmpeg-0.10.3.tar.bz2jpeg源码包:jpegsrc.v8d.tar.gzpng源码包:libpng-1.5.14.tar.gzTIff源码包:tiff-4.0.3.tar.gzx264源码包:x264-snapshot-20120528-2245-stable.tar.bz2 xvid源码包:xvidcore-1.3.2.tar.gzzlib源码包:zlib127.zipOpenCV源码包:OpenCV-2.4.3.tar.bz2(笔者选用的2.4.3,但是里面有个bug在Windows下用mingw32-make编译可能会报错,对于这个bug官方给的建议是升级2.4.4,选用2.4.4应该也可以,可以尝试一下,这个没bug)Qt第三方库:qt-everywhere-opensource-src-4.8.5.tar.gz(笔者没有选用最新的5.1版本,据说这个版本增加了很多功能比如传感器等等,有兴趣可尝试)由于其是这些库中有些很难找,笔者直接传到百度网盘,供下载?shareid=3831914682&uk=1092766566需要注意的是版本一定要正确并且一定要按照以下的顺序安装,否则会出现各种错误。
UBUNTU OPENCV 环境搭建
![UBUNTU OPENCV 环境搭建](https://img.taocdn.com/s3/m/6ddfaa0055270722192ef7f7.png)
Opencv交叉编译到ARM(基于Qt)一、开发环境:环境:ubuntu10.04交叉编译工具:gcc version4.5.1(ctng-1.8.1-FA)友善的东西opencv版本:OpenCV-2.3.1a.tar.bz2(这里可以下载:/projects/opencvlibrary/files/)cmake:cmake version2.8.0()*:前提是Qt交叉编译已经完成,并能正常使用。
一些依赖:在终端运行:sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg62-dev libtiff4-dev cmake libswscale-dev libjasper-dev安装:cmakeapt-get install cmake-guiapt-get install cmake解压:tar xvf OpenCV-2.3.1.tar.bz2我使用的是天嵌提供的交叉编译工具EABI_4.3.3。
安装在/opt/EmbedSky/4.3.3/bin/目录下,解压后,进入目录cd OpenCV-2.3.1运行:cmake-gui如果没有安装,系统会提示你安装选择source file 选择build目录点configure然后选择:next填路径:Operating System:arm-none-linuxCompilers:是交叉编译工具GCC与G++的目录,图中是我的目录Target Root:****点Finish然后再回到Cmake目录下:在这里选择该先与不先的东西,同时因为我之前在x86上编译过所以我把CMAKE_INSTALL_PREFIX改成:/usr/local/arm同时添加了WITH_QT因为添加WITH_QT_OPENGL时编译出错,所以后来去掉了。
opencv的移植到arm开发板的步骤
![opencv的移植到arm开发板的步骤](https://img.taocdn.com/s3/m/a809c8d4c1c708a1284a4477.png)
Opencv移植到开发板的过程在移植opencv前,先要安装几个库:build-essential、manpages-dev、pkg-config、zlib、libpng、libjpeg、libz、libttf。
一、环境:系统:Ubuntu 9.10(内核2.6.31)目标板:sbc6045(系统:Qtopia,内核:2.6.30)交叉编译器:arm-none-linux-gnueabi-gcc二、准备:1、安装依赖库:sudo apt-get install build-essential manpages-dev pkg-config2、安装zlib库,这个是后面库的编译基础。
zlib-1.2.3.tar.gz在/root/opencv目录下# cd /root/opencv# tar -xvzf zlib-1.2.3.tar.gz由于zlib 库的configure 脚本不支持交叉编译选项,只好自己动用了,手动临时把gcc 修改成指向我们的交叉编译器arm-none-linux-gnueabi-gcc# cd /usr/bin# mv gcc gcc_back# ln -s /usr/local/arm/arm-2007q1/bin/arm-none-linux-gnueabi-gcc ./gcc修改完成后回到/root/opencv/zlib-1.2.3 目录下#./configure --prefix=/usr/local/arm/arm-2007q1/arm-none-linux-gnueabi --shared注意:这里配置指向/usr/local/arm/arm-2007q1/arm-none-linux-gnueabi目录,会自动安装在/usr/local/arm/arm-2007q1/arm-none-linux-gnueabi/ [include,lib] 目录下,千万不要装错目录了,不然后面会找不到这个库的# make# make install安装完后检查一下目录/usr/local/arm/arm-2007q1/arm-none-linux-gnueabi/ [include,lib] ,假如include 中没有zlib.h 之类的头文件,lib 中没有libz.so.1.2.3 ,那就自己手动拷到这些目录下去,记着拷的时候把所有的*.h 都需要拷过去,在拷库的时候用cp –a libz.* /…./lib 就行,要用上–a 选项记着把刚才改过的gcc 再改回去,不然后面会出错的!!!!!(一定记得改)# cd /usr/bin# mv gcc_back gcc3、安装libpng库,这个是用来显示libpng图形的,MiniGUI里很多图都是libpng的,如果没有这个库,你的MiniGUI将无法正常工作,切记切记!libpng-1.2.18 .tar.gz在/root/opencv目录下# cd /root/opencv# tar -xvzf libpng-1.2.18 .tar.gz# cd libpng-1.2.18注意这边的配置:①使用交叉编译器②安装目录③—host 指定软将运行平台,不然终端也会提示说叫你使用—host 参数的。
CentOS中OpenCV的配置
![CentOS中OpenCV的配置](https://img.taocdn.com/s3/m/fdafcba41b37f111f18583d049649b6648d709b0.png)
CentOS中OpenCV的配置一、确认使用CentOS6.5以上版本,LZ使用6.3版本纠结了两周没有安好。
二、交叉编译的OpenCV使用cmake前切记用echo $CROSS_COMPILE检查环境变量妥否。
1、安装X264注意我们的交叉编译器已经够用,不必用yasm。
先定位至x264的解压目录下。
执行:./configure--host=arm-linux --cross-prefix=arm-xilinx-linux-gnueabi- --enable-shared --prefix=/home/wxwhappy/CodeSourcery/Sourcery_CodeBench_L ite_^/arm-xilinx-linux-gnueabi/ libc/usr执行:make执行:make install2、安装Xvid注意必须禁用汇编。
先定位至Xvid解压目录下,然后进入到./build/generic目录中执行:./configure--prefix=/home/wxwhappy/CodeSourcery/Sourcery_CodeBench_L ite_^/arm-xilinx-linux-gnueabi/ libc/usr --host= arm-xilinx-linux-gnueabi --disable-assembly执行:make执行:make install3、安装ffmpeg定位至ffmpeg解压目录下执行:./configure--prefix=/home/wxwhappy/CodeSourcery/Sourcery_CodeBench_L ite_^/arm-xilinx-linux-gnueabi/ libc/usr --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --CC=arm-xilinx-linux-gnueabi-gcc --enable-swscale --extra-cflags=-I/home/wxwhappy/CodeSourcery/Sourcery_CodeBench_Lite_^/ arm-xilinx-linux-g nueabi/libc/usr/include--extra-ldflags=-L/home/wxwhappy/CodeSourcery/Sourcery_CodeBench_Lite_^/ arm-xilinx-linux-gnueabi/libc/usr/lib --disable-asm执行:make执行:make install4、交叉编译OpenCV4.1首先需要有交叉编译器arm-xilinx-linux-gnueabi,其次要安装了cmake,最后需要解压OpenCV至指定目录/OpenCV-2.3.1;注意此时的解压一定要使用命令解压:tar -xvjf OpenCV-2.3.1.tar.bz2 -C ./4.2 在OpenCV的目录下新建文件夹build和install,在build目录中新建文件toolchain.cmake,键入如下内容:set(CMAKE_SYSTEM_NAME Linux)set(CMAKE_SYSTEM_PROCESSOR arm)set(CMAKE_C_COMPILER arm-xilinx-linux-gnueabi-gcc)set(CMAKE_CXX_COMPILER arm-xilinx-linux-gnueabi-g++)4.3 文件OpenCVFindPkgConfig.cmake是调用pkg-config工具找包的,因此需要一个环境变量,以便找到第三方库。
Opencv2.0移植ARM全过程
![Opencv2.0移植ARM全过程](https://img.taocdn.com/s3/m/3d0503d5d15abe23482f4d96.png)
2. 配置选项: $ ./configure --prefix=/home/liuxiu/opencv-arm --enable-pic –enable-shared --cross-prefix=armlinux- --host=arm-linux --extra-cflags=-I/home/liuxiu/opencv-arm/include --extra-ldflags=L/home/liuxiu/opencv-arm/lib --enable-shared --enable-pthread –disable-asm 出现 ./version.sh: 行 2: git: 未找到命令 Platform: ARM System: LINUX asm: no avs input: no lavf input: no ffms input: no mp4 output: no pthread: yes debug: no gprof: no PIC: yes shared: yes visualize: no
二、交叉编译 libjpeg
版本 jpegsrc.v6b,这些库都可以从官网上下载的。
1. 解压进入目录
2. 配置选项: $./configure –prefix=/home/liuxiu/opencv-arm –exec-prefix=/home/liuxiu/opencv-arm –-enableshared --enable-static 下面分别介绍这几个参数的作用: --prefix=/home/liuxiu/opencv-arm : 执行 make install 后,会将与体系无关的文件拷贝到此目录 下,具 体如下: /home/liuxiu/opencv-arm ....................................
交叉编译opencv移植到海思3518
![交叉编译opencv移植到海思3518](https://img.taocdn.com/s3/m/9a6e7ce77d1cfad6195f312b3169a4517723e5c9.png)
交叉编译opencv移植到海思35181.下载opencv源码2.下载cmake-gui在ubuntu虚拟机上安装cmake-gui,apt-get install cmake-qt-gui,并运⾏cmake-gui安装gtk等:apt-get install libgtk2.0-dev pkg-config3.交叉编译opencv3.1 导⼊hisi编译器路径下图为参考,我实际的是himix100。
CMAKE_C_FLAGS和CMAKE_CXX_FLAGS 增加-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4勾选ReleaseCMAKE_EXE_LINKER_FLAGS 增加 -lpthread -lrt -ldl去除with项的依赖,精简opencv⼤⼩选择⽣成的静态库还是动态库,这⾥我编译的是静态库。
根据需要勾选依赖库,是否编译为⼀个⽂件点击Generate⽣成后,到build路径执⾏make -j8,编译⽣成lib下的库4.精简动态库将⽣成的libopencv_world.a链接到⾃⼰的代码编译为so后,可以使⽤arm-himix100-linux-strip libxxxx.so再精简⽣成的动态库,以便在3518下可以放得下。
经过测试,增加CMAKE_C_FLAGS和CMAKE_CXX_FLAGS 增加-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4编译优化,可以使opencv运⾏时间减少⼀半。
移除with项依赖和选择所需的库,编译成静态库.a⽂件再链接⾃⼰的代码编译成动态库,可以⼤⼤减少⽣成库的⼤⼩。
参考:。
交叉编译原理
![交叉编译原理](https://img.taocdn.com/s3/m/82e0255f1fd9ad51f01dc281e53a580217fc505e.png)
交叉编译原理
交叉编译是指在一台主机上生成能在另一种不同的硬件或操作系统平台上运行的可执行程序的编译过程。
其原理如下:
1. 确认目标平台:首先需要明确要编译的目标平台,包括目标硬件架构以及操作系统类型和版本。
2. 准备交叉编译工具链:由于编译器和链接器都需要针对目标平台生成可执行文件,所以需要准备一个适用于目标平台的交叉编译工具链,包括交叉编译器、链接器、库文件等。
3. 配置编译环境:在进行交叉编译之前,需要配置编译环境,包括设置环境变量、指定编译器和链接器的路径以及相关的编译选项等。
4. 编译源代码:使用交叉编译工具链中的交叉编译器,将源代码文件编译成目标平台可执行文件。
编译过程中需要使用目标平台的头文件和库文件,以确保生成的可执行文件能够在目标平台上正确运行。
5. 链接可执行文件:使用交叉编译工具链中的交叉链接器,将编译生成的目标文件链接成最终的可执行文件。
链接过程中需要指定目标平台的库文件路径,以及其他相关的链接选项。
6. 调试和优化:在完成编译和链接之后,可以进行调试和性能优化。
通常情况下,调试和优化工具也需要适配到目标平台上。
7. 部署和运行:将生成的可执行文件部署到目标平台上,并在目标平台上运行进行测试和验证。
交叉编译的原理是通过在一台主机上模拟目标平台的编译环境,使用交叉编译工具链将源代码编译成目标平台的可执行文件。
这样可以避免在目标平台上安装和配置开发环境,同时提高开发效率。
Opencv4.1.0交叉编译----终端摄像头内算法嵌入,海思HISI、雄迈ARM编译链使用经验
![Opencv4.1.0交叉编译----终端摄像头内算法嵌入,海思HISI、雄迈ARM编译链使用经验](https://img.taocdn.com/s3/m/dcaee0e6bb0d4a7302768e9951e79b8968026803.png)
Opencv4.1.0交叉编译----终端摄像头内算法嵌⼊,海思HISI、雄迈ARM编译链使⽤经验引: 项⽬需求,在终端摄像头⾥嵌⼊简单算法,进⾏图像预处理,考虑使⽤Opencv和dlib实现,本博客阿星记录Opencv在摄像头中arm 开发板交叉编译与使⽤的经验环境:主机系统:Ubuntu16.04Opencv版本: 4.1.0交叉编译器:海思Hi3516C V500R001C02SPC010版本编译链,雄迈编译链⾃动化编译⼯具: cmake version 3.5.1⼀、交叉编译opencv引:本⽂使⽤两种博主亲测⽅法进⾏opencv的交叉编译下载Opencv安装cmakesudo apt-get install cmakesudo apt-get install cmake-gui安装基础# ubuntu16.04 默认⾃带安装sudo apt-get install build-essential# ubuntu16.04 除了git,其他默认⾃带安装sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev# libdc1394-22-dev 需要安装,其他默认⾃带安装sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev⼀ >1、⽅法⼀确保已安装cmake,直接使⽤下述shell脚本进⾏⼀键交叉编译,项⽬后期博主采⽤的即本⽅式,交叉编译中会出现的问题,⽅法⼀⼆相同,记录在本博客编译⽅法之后将opencv源码解压后,进⼊opencv⽬录,创建build⽂件夹。
交叉编译 原理
![交叉编译 原理](https://img.taocdn.com/s3/m/f255d3eff424ccbff121dd36a32d7375a417c6c6.png)
交叉编译原理
交叉编译是指在一台计算机上编译运行在另一种不同的计算机或操作系统上运行的程序的过程。
在传统的编译过程中,将源代码编译为可执行程序的过程发生在同一种计算机或操作系统中。
然而,当需要在不同类型的计算机或操作系统上运行程序时,就需要使用交叉编译。
交叉编译的原理是通过使用一个称为交叉编译器的工具,该工具能够在一个操作系统上生成在另一个操作系统上运行的可执行文件。
交叉编译器能够理解和转换不同操作系统的机器指令集和库文件等。
交叉编译的过程大致可以分为以下几个步骤:
1. 选择一个适用于目标操作系统的交叉编译器。
这个交叉编译器需要能够根据源代码的语言和目标操作系统的体系结构生成可执行文件。
2. 配置交叉编译器的环境变量。
这些环境变量包括交叉编译器的路径和目标操作系统的体系结构等信息。
3. 使用交叉编译器编译源代码。
这个过程中,交叉编译器会将源代码翻译成目标操作系统所需的机器指令集。
4. 链接库文件和生成可执行文件。
交叉编译器会将源代码中所需的库文件和目标操作系统的库文件进行链接,生成可在目标
操作系统上运行的可执行文件。
交叉编译的好处是可以在一台计算机上快速地生成适用于多种操作系统的可执行文件,提高了开发效率。
例如,开发者可以在自己的Windows电脑上使用交叉编译器生成用于Linux服务器的可执行文件,而无需在Linux环境中进行开发和编译。
这样可以节省时间和资源,提高开发效率和灵活性。
CMake的交叉编译问题Linuxx86-arm11
![CMake的交叉编译问题Linuxx86-arm11](https://img.taocdn.com/s3/m/0e11d4946429647d27284b73f242336c1eb93069.png)
CMake的交叉编译问题Linuxx86-arm11/cjsycyl/article/details/493345432015如果你的英文比较好,那么可以看这里:/Wiki/CMake_Cross_Compiling,这是CMake官方网站上一篇介绍如何交叉编译的文章,我也是主要参考这篇文章完成了我的交叉编译。
但是我的交叉编译过程不是翻译它的,是根据我自己交叉编译的过程,从了解CMake到完成交叉编译写的,容易入门,不涉及深入研究。
转载请注明原出处:/%E6%99%A8%E6%B1%A0/blog/item/c0199 2f9983b4e42252df227.html概念性介绍首先介绍一下CMake。
本文是针对CMake菜鸟的,所以必须先对CMake有一个大概的认识,知道这是什么、怎么用以后,才可以考虑交叉编译不是?CMake 是一个跨平台自动编译工具,在KDE等开源项目当中有很好的应用,从而证明了CMake的强大功能。
CMake的作用是根据设定的配置自动生成编译脚本,在Linux下就是生成Makefile,在Windows下就是生成VS的工程文件,这也是CMake产生的初衷和优点,使用CMake就可以为工程只写一个CMake脚本然后到各种平台上都能编译。
比如一个跨平台的工程,可以在Linux、Windows和苹果上编译,那么以前的做法就是提供三套编译脚本,Linux下就是Makefile,Windows下就是VS的工程文件,如果有修改要添加删除文件呢,也只能三个地方都修改(任何一个程序员对会对这种做法嗤之以鼻,为什么不统一到一个地方呢?),而使用了CMake以后呢,就可以仅仅修改CMake的设定,然后运行CMake,CMake会根据当前的操作系统自动生成可用的的脚本,然后该Make就Make该VS就VS吧。
具体的使用呢,如果你拿到的是一个人家已经配置好的工程,那么一般来说敲cmake,就会发现目录下面多了一个Makefile出来,这时候敲make就可以编译通过了(顺利的情况下)。
opencv的交叉编译
![opencv的交叉编译](https://img.taocdn.com/s3/m/9350d3d06aec0975f46527d3240c844769eaa009.png)
opencv的交叉编译交叉编译是一种在一台主机上为另一种不同架构的目标设备生成可执行文件的过程。
对于OpenCV来说,交叉编译可以用于在一个平台上编译生成在另一个平台上运行的应用程序。
首先,你需要准备好交叉编译工具链。
这个工具链包括交叉编译器、交叉编译的库文件和头文件等。
你可以从官方网站或第三方提供的资源中获取适用于目标设备的交叉编译工具链。
接下来,你需要配置编译环境。
这包括设置环境变量,指定交叉编译器的路径,以及设置其他编译选项。
具体的配置步骤可能因平台和工具链的不同而有所差异,请参考相关文档或教程进行配置。
然后,你需要下载OpenCV的源代码,并解压到一个目录中。
进入源代码目录后,创建一个新的目录作为编译输出目录。
接下来,你需要使用CMake来配置OpenCV的编译选项。
在交叉编译的情况下,你需要指定交叉编译器的路径和其他相关选项。
例如,你可以使用以下命令进行配置:cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain/file.txt -DCMAKE_INSTALL_PREFIX=/path/to/installation/directory ..其中,`/path/to/toolchain/file.txt`是你下载的交叉编译工具链中的工具链文件,`/path/to/installation/directory`是你希望安装OpenCV的目标设备上的路径。
配置完成后,运行`make`命令开始编译OpenCV。
这个过程可能需要一些时间,具体取决于你的编译环境和硬件性能。
编译完成后,你可以使用`make install`命令将编译好的库文件和头文件安装到指定的安装路径中。
最后,将生成的可执行文件和所需的库文件复制到目标设备上,并确保目标设备上的运行环境满足OpenCV的依赖需求。
然后,你就可以在目标设备上运行你的OpenCV应用程序了。
需要注意的是,交叉编译涉及到不同平台和架构之间的差异,可能会遇到一些问题和挑战。
opencv交叉编译so库详解
![opencv交叉编译so库详解](https://img.taocdn.com/s3/m/b9339e3fa36925c52cc58bd63186bceb19e8ed9e.png)
opencv交叉编译so库详解交叉编译OpenCV库通常是为了在一个平台上生成在另一个平台上运行的共享库(SO库)。
这种情况通常发生在嵌入式系统或其他非本地目标平台上。
以下是一个简要的步骤和解释,供您参考:准备交叉编译工具链:首先,您需要获取适用于目标平台的交叉编译工具链。
这可能是由目标平台的制造商提供的,或者您可以使用一些交叉编译工具,如crosstool-ng。
配置环境变量:将交叉编译工具链的路径添加到您的环境变量中,以确保系统知道在哪里找到交叉编译器和工具。
export PATH=/path/to/your/cross/compiler:$PATH下载OpenCV源代码:下载OpenCV的源代码。
您可以从OpenCV官方网站上获取源代码,然后解压缩到您的工作目录。
创建构建目录:在OpenCV源代码目录外创建一个用于构建的目录,并进入该目录。
mkdir buildcd build配置CMake:运行CMake配置,指定交叉编译器和其他必要的参数。
cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/your/toolchain-file.cmake ..其中,/path/to/your/toolchain-file.cmake 是您为目标平台编写的CMake工具链文件。
进行编译:运行make命令进行编译。
make生成共享库:编译完成后,在构建目录中,您将会找到生成的OpenCV共享库文件(.so文件)。
传输到目标平台:将生成的共享库传输到目标平台。
在目标平台上使用:在目标平台上,您可以使用传输过去的共享库进行开发。
请注意,上述步骤的具体细节可能因您的目标平台和环境而异。
确保您查看OpenCV文档和目标平台的文档,以获取更详细的信息。
CMake工具链文件是关键的一步,因为它告诉CMake如何使用交叉编译器和其他工具。
在这个文件中,您需要配置适合您目标平台的编译器、库路径、头文件路径等信息。
Opencv3.2.0交叉编译和移植
![Opencv3.2.0交叉编译和移植](https://img.taocdn.com/s3/m/acb791156ad97f192279168884868762caaebb9c.png)
Opencv3.2.0交叉编译和移植1. 从官⽹()下载opencv3.2.0源码压缩包。
2. 将压缩包上传到Ubuntu下的⼯作⽬录(/home/work)下,使⽤命令tar zxvf opencv-3.2.0.tar.gz解压到当前⽂件夹。
3. cd opencv-3.2.0/platforms/linux进⼊linux编译⽬录。
4. sudogedit arm.toolchain.cmake修改该cmake⽂件内容如下:if(COMMAND toolchain_save_config)return() # prevent recursive callendif()set(CMAKE_SYSTEM_NAME Linux)set(CMAKE_SYSTEM_VERSION 1)if(NOT DEFINED CMAKE_SYSTEM_PROCESSOR)set(CMAKE_SYSTEM_PROCESSOR arm-linux-gnueabihf)else()#message("CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}")endif()include("${CMAKE_CURRENT_LIST_DIR}/gnu.toolchain.cmake")if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm AND NOT ARM_IGNORE_FP)set(FLOAT_ABI_SUFFIX "")if(NOT SOFTFP)set(FLOAT_ABI_SUFFIX "hf")endif()endif()if(NOT "x${GCC_COMPILER_VERSION}" STREQUAL "x")set(__GCC_VER_SUFFIX "-${GCC_COMPILER_VERSION}")endif()#CROSS COMPILE SETTING#set(CMAKE_C_COMPILER "/usr/local/linaro-multilib-2013.09-gcc4.8/bin/arm-linux-gnueabihf-gcc")#set(CMAKE_CXX_COMPILER "/usr/local/linaro-multilib-2013.09-gcc4.8/bin/arm-linux-gnueabihf-g++")#set(CMAKE_FIND_ROOT_PATH "/usr/local/linaro-multilib-2013.09-gcc4.8")#set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)#set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)#set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)set(TOOLCHAIN_DIR "/usr/local/linaro-multilib-2013.09-gcc4.8/")set(CMAKE_C_COMPILER "/usr/local/linaro-multilib-2013.09-gcc4.8/bin/arm-linux-gnueabihf-gcc")set(CMAKE_CXX_COMPILER "/usr/local/linaro-multilib-2013.09-gcc4.8/bin/arm-linux-gnueabihf-g++")set(CMAKE_FIND_ROOT_PATH /usr/local/linaro-multilib-2013.09-gcc4.8/)set(ARM_LINUX_SYSROOT /usr/local/linaro-multilib-2013.09-gcc4.8 CACHE PATH "ARM cross compile system root")link_directories("/usr/local/linaro-multilib-2013.09-gcc4.8")link_libraries("/usr/local/linaro-multilib-2013.09-gcc4.8/lib/libz.so.1")#MESSAGE(STATUS "This is cross compile dir --->"$(CMAKE_C_COMPILER))#if(NOT DEFINED CMAKE_C_COMPILER)# find_program(CMAKE_C_COMPILER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-gcc${__GCC_VER_SUFFIX})#else()# #message(WARNING "CMAKE_C_COMPILER=${CMAKE_C_COMPILER} is defined")#endif()#if(NOT DEFINED CMAKE_CXX_COMPILER)# find_program(CMAKE_CXX_COMPILER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-g++${__GCC_VER_SUFFIX})#else()# #message(WARNING "CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} is defined")#endif()#if(NOT DEFINED CMAKE_LINKER)# find_program(CMAKE_LINKER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ld${__GCC_VER_SUFFIX} ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ld) #else()# #message(WARNING "CMAKE_LINKER=${CMAKE_LINKER} is defined")#endif()#if(NOT DEFINED CMAKE_AR)# find_program(CMAKE_AR NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ar${__GCC_VER_SUFFIX} ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ar)#else()# #message(WARNING "CMAKE_AR=${CMAKE_AR} is defined")#endif()#if(NOT DEFINED ARM_LINUX_SYSROOT AND DEFINED GNU_MACHINE)# set(ARM_LINUX_SYSROOT /usr/${GNU_MACHINE}${FLOAT_ABI_SUFFIX})#endif()#if(NOT DEFINED CMAKE_CXX_FLAGS)# set(CMAKE_CXX_FLAGS "" CACHE INTERAL "")# set(CMAKE_C_FLAGS "" CACHE INTERAL "")# set(CMAKE_SHARED_LINKER_FLAGS "" CACHE INTERAL "")# set(CMAKE_MODULE_LINKER_FLAGS "" CACHE INTERAL "")# set(CMAKE_EXE_LINKER_FLAGS "" CACHE INTERAL "")# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")# if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)# set(CMAKE_CXX_FLAGS "-mthumb ${CMAKE_CXX_FLAGS}")# set(CMAKE_C_FLAGS "-mthumb ${CMAKE_C_FLAGS}")# set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,nocopyreloc")# endif()# if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)# set(ARM_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")# elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)# set(ARM_LINKER_FLAGS "-Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")# endif()# set(CMAKE_SHARED_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")# set(CMAKE_MODULE_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")# set(CMAKE_EXE_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")#else()# #message(WARNING "CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}' is defined")#endif()set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now ${CMAKE_SHARED_LINKER_FLAGS}") set(CMAKE_MODULE_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now ${CMAKE_MODULE_LINKER_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now ${CMAKE_EXE_LINKER_FLAGS}")if(USE_NEON)message(WARNING "You use obsolete variable USE_NEON to enable NEON instruction set. Use -DENABLE_NEON=ON instead." )set(ENABLE_NEON TRUE)elseif(USE_VFPV3)message(WARNING "You use obsolete variable USE_VFPV3 to enable VFPV3 instruction set. Use -DENABLE_VFPV3=ON instead." )set(ENABLE_VFPV3 TRUE)endif()#set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${ARM_LINUX_SYSROOT})if(EXISTS ${CUDA_TOOLKIT_ROOT_DIR})set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${CUDA_TOOLKIT_ROOT_DIR})endif()set(TOOLCHAIN_CONFIG_VARS ${TOOLCHAIN_CONFIG_VARS}ARM_LINUX_SYSROOTENABLE_NEONENABLE_VFPV3CUDA_TOOLKIT_ROOT_DIR)set( CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries." )set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)# macro to find programs on the host OSmacro( find_host_program )set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER )set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER )if( CMAKE_HOST_WIN32 )SET( WIN32 1 )SET( UNIX )elseif( CMAKE_HOST_APPLE )SET( APPLE 1 )SET( UNIX )endif()find_program( ${ARGN} )SET( WIN32 )SET( APPLE )SET( UNIX 1 )set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )endmacro()# macro to find packages on the host OSmacro( find_host_package )set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER )set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER )if( CMAKE_HOST_WIN32 )SET( WIN32 1 )SET( UNIX )elseif( CMAKE_HOST_APPLE )SET( APPLE 1 )SET( UNIX )endif()find_package( ${ARGN} )SET( WIN32 )SET( APPLE )SET( UNIX 1 )set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )endmacro()toolchain_save_config()5. 在opencv-3.2.0⽂件夹下新建编译⽂件夹mkdir build_src; cd build_src/ 进⼊编译⽂件夹。
交叉编译的不足
![交叉编译的不足](https://img.taocdn.com/s3/m/3f676e586ad97f192279168884868762caaebbe3.png)
交叉编译的不足
交叉编译的不足主要包括以下几点:
1. 编译过程较为繁琐:交叉编译需要搭建不同的编译环境,对于大型项目来说,编译时间较长。
2. 兼容性问题:虽然交叉编译可以产生针对特定硬件和操作系统的特定代码,从而提高软件的可移植性,但这也可能会导致兼容性问题。
例如,某些特定的编译器或构建工具可能无法在特定的操作系统或硬件平台上运行。
3. 调试困难:交叉编译生成的代码可能难以进行调试,因为调试工具可能无法在目标平台上运行。
这可能需要额外的工具或方法来进行调试。
4. 资源消耗:交叉编译需要使用大量的计算和存储资源。
对于有限的设备,这可能会影响其性能或可用性。
5. 维护困难:交叉编译生成的代码可能需要额外的维护和管理。
例如,如果目标平台的硬件或操作系统发生变化,可能需要重新编译或调整代码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录1所需要的库及其依赖关系3 2准备工作3 3各个平台配置43.1安装设置 (4)3.1.1armv7-linux平台 (4)3.1.2aarch64-linux平台 (4)3.1.3armv7-android平台 (4)3.1.4aarch64-android平台 (5)3.2zlib安装 (5)3.2.1armv7-linux平台 (5)3.2.2aarch64-linux平台 (5)3.2.3armv7-android平台 (6)3.2.4aarch64-android平台 (6)3.3libpng安装 (6)3.3.1armv7-linux平台 (6)3.3.2aarch64-linux平台 (7)3.3.3armv7-android平台 (7)3.3.4aarch64-android平台 (7)3.4libjpeg安装 (8)3.4.1armv7-linux平台 (8)3.4.2aarch64-linux平台 (8)3.4.3armv7-android平台 (8)3.4.4aarch64-android平台 (9)3.5yasm安装 (9)3.5.1armv7-linux平台 (9)3.5.2aarch64-linux平台 (9)3.5.3armv7-android平台 (10)3.5.4aarch64-android平台 (10)3.6x264安装 (10)3.6.1armv7-linux平台 (10)3.6.2aarch64-linux平台 (11)3.6.3armv7-android平台 (11)3.6.4aarch64-android平台 (12)3.7libv4l安装 (12)3.7.1armv7-linux平台 (12)3.8xvid安装 (12)3.8.1armv7-linux平台 (12)3.8.2aarch64-linux平台 (13)3.8.3armv7-android平台 (13)3.8.4aarch64-android平台 (13)3.9ffmpeg安装 (13)3.9.1armv7-linux平台 (13)3.9.2aarch64-linux平台 (14)3.9.3armv7-android平台 (15)3.9.4aarch64-android平台 (15)3.10opencv安装 (16)3.10.1armv7-linux平台 (16)3.10.2aarch64-linux平台 (16)3.10.3armv7-android平台 (17)3.10.4aarch64-android平台 (18)1所需要的库及其依赖关系1.zlib2.libpng(依赖于zlib)3.libjpeg4.x2645.yasm6.libv4l7.xvid8.ffmpeg(依赖于x264与xvid)9.opencv-2.4.13(依赖于ffmpeg与zlib)2准备工作1.找到交叉编译器的路径,如/opt/toolchains/android-toolchain-aarch64/bin/aarch64-linux-android-gcc2.准备好所有安装包,如图1所⽰。
图1:backup⽂件夹内容•需要⽤CMakeLists.txt覆盖Opencv⽬录下原CMakeList.txt⽂件(4个平台均如此)。
•cap_ffmpeg_impl.hpp以及OpenCVFindLibsVideos.cmake在安卓的两个平台配置时需要使⽤(因为编译安卓系统的库时,Opencv默认会关闭FFM-PEG这个依赖库的选项,如果⼿动修改配置⽂件,将其打开,会出现⼀些报错。
cap_ffmpeg_impl.hpp是为了解决其中⼀个报错“找不到头⽂件sys/sys***.h”⽽准备的,该⽂件在Opencv目录下,具体位置请通过find 命令搜寻)•OpenCVFindLibsVideos.cmake是为了打开FFMPEG这个依赖库的选项⽽准备的。
•arm-gnueabi.toolchain.cmake是为了配置armv7-linux平台的环境准备的。
3各个平台配置3.1安装设置注:以下的所有配置请⼀段⼀段地复制到命令⾏,可能过程中会出现⼀些小问题。
复制前注意检查代码是否需要修改。
3.1.1armv7-linux平台1CC1='/usr/bin/arm-linux-gnueabihf-gcc'2LD='/usr/bin/arm-linux-gnueabihf-ld'3AR='/usr/bin/arm-linux-gnueabihf-ar'4RANLIB='/usr/bin/arm-linux-gnueabihf-ranlib'5STRIP='/usr/bin/arm-linux-gnueabihf-strip'6PREFIX='/home/liuzili/arm-linux-build'#安装⽬录7HOST='arm-linux'#编译出的库在什么平台上运⾏3.1.2aarch64-linux平台1CC1='/opt/toolchains/linux-toolchain-aarch64/bin/aarch64-linux-gnu-gcc'2LD='/opt/toolchains/linux-toolchain-aarch64/bin/aarch64-linux-gnu-ld'3AR='/opt/toolchains/linux-toolchain-aarch64/bin/aarch64-linux-gnu-ar'4RANLIB='/opt/toolchains/linux-toolchain-aarch64/bin/aarch64-linux-gnu-ranlib'5STRIP='/opt/toolchains/linux-toolchain-aarch64/bin/aarch64-linux-gnu-strip'6PREFIX='/home/liuzili/linux-aarch64-build'7HOST='aarch64-linux'8export LDFLAGS="-L$PREFIX/lib"9export CPPFLAGS="-I$PREFIX/include"10YOUR_BUILD_PATH='/home/liuzili/linux-aarch64'11TOOLCHAINS='/opt/toolchains/linux-toolchain-aarch64'12CROSS_PREFIX="$TOOLCHAINS/bin/aarch64-linux-gnu-"13ARCH="aarch64"3.1.3armv7-android平台1CC1='/opt/toolchains/android-toolchain-armv7/bin/arm-linux-androideabi-gcc'2LD='/opt/toolchains/android-toolchain-armv7/bin/arm-linux-androideabi-ld'3AR='/opt/toolchains/android-toolchain-armv7/bin/arm-linux-androideabi-ar'4RANLIB='/opt/toolchains/android-toolchain-armv7/bin/arm-linux-androideabi-ranlib'5STRIP='/opt/toolchains/android-toolchain-armv7/bin/arm-linux-androideabi-strip'6PREFIX='/home/liuzili/armv7-android-build'7HOST='arm-linux-android'8TOOLCHAINS='/opt/toolchains/android-toolchain-armv7'9SYSROOT="$TOOLCHAINS/sysroot"10CROSS_PREFIX="$TOOLCHAINS/bin/arm-linux-androideabi-"11EXTRA_CFLAGS="-march=armv7-a-mfloat-abi=softfp-mfpu=neon-mthumb-D__ANDROID__...-D__ARM_ARCH_7__-D__ARM_ARCH_7A__-D__ARM_ARCH_7R__-D__ARM_ARCH_7M__...-D__ARM_ARCH_7S__"12EXTRA_LDFLAGS="-nostdlib"13YOUR_BUILD_PATH="/home/liuzili/armv7-android"3.1.4aarch64-android平台1CC1='/opt/toolchains/android-toolchain-aarch64/bin/aarch64-linux-android-gcc'2LD='/opt/toolchains/android-toolchain-aarch64/bin/aarch64-linux-android-ld'3AR='/opt/toolchains/android-toolchain-aarch64/bin/aarch64-linux-android-ar'4RANLIB='/opt/toolchains/android-toolchain-aarch64/bin/aarch64-linux-android-ranlib'5STRIP='/opt/toolchains/android-toolchain-aarch64/bin/aarch64-linux-android-strip'6PREFIX='/home/liuzili/test-aarch64/3rdpart-aarch64-install'7HOST='aarch64-linux-android'8TOOLCHAINS='/opt/toolchains/android-toolchain-aarch64'9SYSROOT="$TOOLCHAINS/sysroot"10CROSS_PREFIX="$TOOLCHAINS/bin/aarch64-linux-android-"11YOUR_BUILD_PATH='¬/ad-aarch64'12EXTRA_CFLAGS="-march=armv8-a-D__ANDROID__-D__ARM_ARCH_8__-D__ARM_ARCH_8A__"13EXTRA_LDFLAGS="-nostdlib"3.2zlib安装zlib⼀般最先编译,因为libpng以及后⾯的ffmpeg的编译会依赖它。