采用
交叉编译的主要原因在于,多数嵌入式目标系统不能提供足够的资源供编译过程使用,因而只好将编译工程转移到高性能的主机中进行。linux下的交叉编译环境重要包括以下几个部分:1.对目标系统的编译器gcc2.对目标系统的二进制工具binutils3.目标系统的标准c库glibc4.目标系统的linux内核头文件交叉编译环境的建立步骤一、下载源代码 下载包括binutils、gcc、glibc及linux内核的源代码(需要注意的是,glibc和内核源代码的版本必须与目标机上实际使用的版本保持一致),并设定shell变量PREFIX指定可执行程序的安装
路径。二、编译binutils 首先运行configure文件,并使用--prefix=$PREFIX参数指定安装路径,使用--target=arm-linux参数指定目标机类型,然后执行make install。三、配置linux内核头文件首先执行make mrproper进行清理工作,然后执行make config ARCH=arm(或make menuconfig/xconfig ARCH=arm)进行配置(注意,一定要在命令行中使用ARCH=arm指定cpu架构,因为缺省架构为主机的cpu架构),这一步需要根据目标机的实际情况进行详细的配置,笔者进行的实验中目标机为HP的ipaq-hp3630 PDA,因而设置system type为SA11X0,SA11X0 Implementations中选择Compaq iPAQ H3600/H3700。配置完成之后,需要将内核头文件拷贝到安装目录: cp -dR include/asm-arm $PREFIX/arm-linux/include/asm cp -dR include/linux $PREFIX/arm-linux/include/linux四、第一次编译gcc首先运行configure文件,使用--prefix=$PREFIX参数指定安装路径,使用--target=arm-linux参数指定目标机类型,并使用--disable-threads、--disable-shared、--enable-languages=c参数,然后执行make install。这一步将生成一个最简的gcc。由于编译整个gcc是需要目标机的glibc库的,它现在还不存在,因此需要首先生成一个最简的gcc,它只需要具备编译目标机glibc库的能力即可。五、交叉编译glibc这一步骤生成的代码是针对目标机cpu的,因此它属于一个交叉编译过程。该过程要用到linux内核头文件,默认路径为$PREFIX/arm-linux/sys-linux,因而需要在$PREFIX/arm-linux中建立一个名为sys-linux的软连接,使其内核头文件所在的include目录;或者,也可以在接下来要执行的configure命令中使用--with-headers参数指定linux内核头文件的实际路径。configure的运行参数设置如下(因为是交叉编译,所以要将编译器变量CC设为arm-linux-gcc): CC=arm-linux-gcc ./configure --prefix=$PREFIX/arm-linux --host=arm-linux --enable-add-ons 最后,按以上配置执行configure和make install,glibc的交叉编译过程就算完成了,这里需要指出的是,glibc的安装路径设置为$PREFIXARCH=arm/arm-linux,如果此处设置不当,第二次编译gcc时可能找不到glibc的头文件和库。六、第二次编译gcc运行configure,参数设置为--prefix=$PREFIX --target=arm-linux --enable-languages=c,c++。运行make install。到此为止整个交叉编译环境就完全生成了。几点注意事项第一点、在第一次编译gcc的时候可能会出现找不到stdio.h的错误,解决办法是修改gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS变量的设定中增加-Dinhibit_libc和-D__gthr_posix_h。交叉编译opencv主要参考了这篇文章:
https://blog.csdn.net/kaychangeek/article/details/80113289
一、如何配置cmake
1、where is the source code:即opencv源码路径
where to build the binaries:编译生成的库文件放在这个路径下,自己设置的,自己记住就好
2、点configure按钮,d出配置窗口,选最后一个,然后next。
3、输入自己的交叉编译器路径,第三方库路径,finish
4、等一会,cmake会出现编译选项,自行修改
我也不太清楚这里面每一个组件的具体用途,就根据网上别人给出的选项作了修改
找到BUILD_ZLIB,勾选上
找到OPENCV_GENERATE_PKGCONFIG,勾选上。这是生成.pc文件的选项
build_opencv_gapi不勾选。不去掉会编译报错
#疑问:是不是选中了witn_xxx选项,就要同时选中build_xxx选项?前面的交叉编译第三方依赖库有用吗?
修改cmake_build_type为Release
修改cmake_install_prefix为你自己的输出文件夹
点Generate,生成Makefile
二、编译
使用gedit打开build路径下的CMakeCache.txt文件,找到CMAKE_EXE_LINKER_FLAGS选项在后面加上:-lpthread -lrt。这是一个多线程链接库
make &&make install
三、配置.pc文件
成功编译的话,你会在输出路径下找到你的库文件
然后你还会在~/lib/pkgconfig下找到你的.pc文件
因为我的电脑也装了x86平台的opencv库,为了便于区分,我把这个.pc文件改成了opencv_arm.pc,然后复制进了pkgconfig的默认路径下。
四、验证
最后验证一下:在samples/CPP中找个例程编译一下:(必须加上-std=c++11,opencv必须有c++2011支持)
大功告成!!!
装这个东西一共花了我了五天时间,几乎每一步我都会遇到问题,好在有各路网友的分享我才能成功。向开源精神致敬!!!
评论列表(0条)