什么是交叉编译?交叉编译就是在我们自己的电脑上编译出其他平台的程序。为什么要进行交叉编译?原因1:WRTnode上的Flash不够装下OpenCV编译过程中产生的文件。原因2:WRTnode编译过程会相当的漫长,就连i7的电脑都需要编译将近十分钟。因此为了提高开发效率,我们通常会选择交叉编译。
为什么要交叉编译OpenCV?因为我们如果需要在WRTnode上运行OpenCV应用,就必须编译好程序之后再上传,如果需要编译OpenCV程序,就必须先进行交叉编译,生成相应的链接库,然后才能编译成最终能实现你想要的功能的程序。所以第一步就是编译mipsel版的OpenCV。
首先我们应该准备以下几个东西:
OpenCV的源码可以在 https://github.com/Itseez/opencv/releasesarrow-up-right 找到,这里作为举例,我们使用的是2.4.11版本的源码。
OpenCV 2.4.11源代码下载地址:https://github.com/Itseez/opencv/archive/2.4.11.tar.gzarrow-up-right
总的来说执行下面的命令就可以直接下载好了:
Copy wget https://github.com/Itseez/opencv/archive/2.4.11.tar.gz
tar zxvf 2.4.11.tar.gz 下载好源码以后,我们再安装CMake并运行:
Copy sudo apt-get update
sudo apt-get install cmake cmake-gui
cmake-gui 选好源码的目录和编译二进制文件存放的目录,比如我在桌面上创建了一个叫opencv-mipsel的目录,用来存放交叉编译的文件,所以我在where to build the binaries 填上了/home/ypw/Desktop/opencv-mipsel。至于source code就是上面下载的源码所在的路径。
设置好之后点击Configure,选择最后一项,Specify options for cross-conpiling 。
Operating System 需要填Linux 而不是其他的。
C和C++编译器需要选择你的SDK目录下的mipsel-openwrt-linux-gcc 和mipsel-openwrt-linux-g++ ,下面是举例:
Target Root自然就是/home/ypw/Desktop/wrtnode/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin
配置好以后就可以点击Finish了!
顺利的话你将会看到许多选项,由于WRTnode并没有图形界面等原因,我们需要去掉一些选项:
我们还需要修改安装的路径:CMAKE_INSTALL_PREFIX ,因为我们并不想把它生成的文件与我们自己安装的OpenCV发生冲突,因此需要进行修改,比如:
点击Generate,生成最后的makefile文件。
进入openwrt-mipsel文件夹,输入make -j8开始编译,编译过程中会看到各种花花绿绿的信息输出,不出意外的话大概需要编译十分钟。
编译过程中出现过 virtual memory exhausted: Cannot allocate memory 错误,解决方法是将虚拟机内存从1GB扩大到4GB或以上。
编译完成以后我们就可以安装刚编译好的库了。