美文网首页
Ubuntu 14.04 LTS下使用arm-linux-gcc

Ubuntu 14.04 LTS下使用arm-linux-gcc

作者: 琦小虾 | 来源:发表于2018-05-24 07:01 被阅读0次

    搬运自本人 CSDN 博客:https://blog.csdn.net/ajianyingxiaoqinghan/article/details/70194392


    Ubuntu 14.04 LTS下使用arm-linux-gcc交叉编译OpenCV 2.4.9

    当前两个手头有两个项目都是都需要在ARM板中使用OpenCV,所以交叉编译必不可少。两三天里一直查阅各种资料,最后终于把交叉编译走通了……
    参考地址:
    http://blog.csdn.net/zdyueguanyun/article/details/51322295
    http://blog.csdn.net/luotuo44/article/details/8958990
    十分感谢上述参考地址的教学,有很重大的指导意义。但中间确实也存在着类似于命令行缺少空格之类的错误,所以笔者准备把自己的交叉编译过程详细写下来,尽量让读者们少走弯路~

    笔者操作环境:

    • PC操作系统:Ubuntu 14.04 LTS
    • OpenCV 2.4.9
    • 编译器:arm-linux-gcc 4.3.2
    • CMake版本:2.8.12

    <font color=red>注:</font>
    <font color=red>1、本文所有操作都需要以root权限进行操作。</font>
    <font color=red>2、笔者使用的所有压缩包下载地址都已分享,且笔者也将其全部打包分享在百度云,百度云下载地址如下。</font>
    链接: https://pan.baidu.com/s/1D40Jq0u1uAbL0mpuPV9_hQ 密码: idju

    一、安装依赖项

    首先,我们需要安装几项与视频解码相关的依赖项。如果没有安装这些依赖项,在对OpenCV的make时,会出现如下结果:
    <code>
    FFMPEG: NO
    -- codec: NO
    -- format: NO
    -- util: NO
    -- swscale: NO
    -- gentoo-style: NO
    </code>

    首先本文的操作全部在root权限下进行,所以第一步先获得root权限:

    sudo su
    

    安装依赖项的指令如下:

    apt-get install libavcodec-dev libavformat-dev libswscale-dev
    

    二、ARM编译器的安装:

    笔者的arm-linux-gcc 4.3.2下载地址如下:
    http://download.csdn.net/detail/xinhuameng/2642452
    直接将arm-linux-gcc-4.3.2.tgz解压在根目录/下:

    tar -zxvf arm-linux-gcc-4.3.2.tgz -C /
    

    进入/root/.bashrc,使用vim或gedit对其进行操作:

    gedit /root/.bashrc
    

    在<code>/root/.bashrc</code>最下方添加环境变量:
    <code>
    export PATH=$PATH:/usr/local/arm/4.3.2/bin
    export OPENCV_DEPEND=/usr/local/arm/opencv-depend
    export OPENCV_INSTALL=/usr/local/arm/opencv-install
    </code>
    如图所示:


    /root/.bashrc

    其中,<code>/usr/local/arm/4.3.2/bin</code>是arm编译器的路径;
    <code>/usr/local/arm/opencv-depend</code>是OpenCV依赖库安装路径;
    <code>/usr/local/arm/opencv-install</code>是OpenCV安装路径。

    此时输入指令或重启电脑,使新的环境变量生效。输入指令如下:

    source /root/.bashrc
    

    检验环境变量生效的方法是:<font color=red>在root权限下</font>,终端中输入arm,然后按Tab键,出现图示如下:


    检验环境变量生效

    只要终端显示出<code>arm-linux-gcc-4.3.2</code>, <code>arm-none-linux-gnueabi-g++</code>, <code>arm-none-linux-gnueabi-gcc</code>, <code>arm-none-linux-gnueabi-gcc-4.3.2</code>,就说明arm编译器已经配置成功了。

    三、安装依赖库

    OpenCV交叉编译之前,首先需要对依赖库进行交叉编译。因为OpenCV依赖于很多库函数,如果在编译OpenCV之前没有编译依赖项,就会导致编译后的OpenCV无法使用。
    OpenCV交叉编译时各个库的依赖关系如下所示:

    • OpenCV
      • zlib
      • jpeg
      • libpng
        • zlib
      • tiff
        • zlib
      • ffmpeg
        • x264
        • xvidcore

    笔者使用的依赖库如下所示:

    • zlib-1.2.11
    • jpegsrc.v9b
    • libpng-1.6.29
    • yasm-1.3.0
    • x264-snapshot-20170415-2245
    • xvidcore_1.3.3.orig
    • ffmpeg-2.8.11

    笔者已经将上述依赖库放置在笔者的云盘中,且下载地址已经在上文分享。另外下载上述依赖库源码的网址如下:

    **<font color=red>注:后面所有的交叉编译操作,都需要进入依赖库解压的地址进行操作。</font>
    如笔者将上述所有源码解压到了路径<code>/home/grq/src/</code>下,且该路径下有如下源码包:
    <code>
    zlib-1.2.11
    jpeg-9b
    libpng-1.6.29
    yasm-1.3.0
    x264-snapshot-20170415-2245
    xvidcore-1.3.3
    ffmpeg-2.8.11
    </code>
    以<code>zlib</code>为例,此时如果笔者想对<code>zlib</code>进行交叉编译,则需要进入到<code>zlib</code>的路径:

    cd /home/grq/src/zlib-1.2.11
    

    随后进行相应的操作。

    <font color=red>其余依赖库的交叉编译都需要进行这一步骤,后续不再赘述。</font>

    1、zlib的交叉编译:

    ./configure --prefix=$OPENCV_DEPEND
    

    之后,对<code>Makefile</code>文件进行修改,修改内容如下:
    <code>
    CC=arm-linux-gcc
    AR=arm-linux-ar
    RANLIB=arm-linux-ranlib
    LDSHARED=arm-linux-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
    </code>
    修改之后,如图所示:


    Makefile 文件修改

    之后执行命令:

    make
    make install
    

    2、libjpeg的交叉编译:

    ./configure --host=arm-linux --prefix=$OPENCV_DEPEND --enable-shared --enable-static
    make
    make install
    

    3、libpng的交叉编译:

    ./configure --host=arm-linux --prefix=$OPENCV_DEPEND --enable-shared --enable-static
    make
    make install
    

    4、yasm的交叉编译:

    CC=arm-linux-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=$OPENCV_DEPEND
    make
    make install
    

    5、libx264的交叉编译:

    CC=arm-linux-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=$OPENCV_DEPEND
    make
    make install
    

    6、libxvid的交叉编译:

    进入<code>libxvid</code>的目录后,再行进入其子目录中:

    cd ./build/generic
    

    然后输入命令:

    ./configure --prefix=$OPENCV_DEPEND --host=arm-linux --disable-assembly
    make
    make install
    

    7、ffmpeg的交叉编译:

    ./configure --prefix=$OPENCV_DEPEND --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=arm-linux-gcc --enable-swscale --extra-ldflags=-L$OPENCV_DEPEND/lib --extra-cflags=-I$OPENCV_DEPEND/include
    

    <font color=red>注:按照该流程安装时,下载ffmpeg 2.8版本,不要下载最新的ffmpeg 3.3版本!否则可能会像笔者编译OpenCV至21%时,显示make错误;</font>

    至此,依赖库编译安装完成。

    8、OpenCV依赖库复制到ARM编译器路径下

    此时,需要将路径<code>/usr/local/arm/opencv-depend</code>下的lib和include中所有文件分别拷贝到路径<code>/usr/local/arm/4.3.2/arm-non-linux-gnueabi/</code>下的lib和include下。命令如下:

    cp -r /usr/local/arm/opencv-depend/include/ /usr/local/arm/4.3.2/arm-none-linux-gnueabi/
    cp -r /usr/local/arm/opencv-depend/lib/ /usr/local/arm/4.3.2/arm-none-linux-gnueabi/
    

    如果没有进行该步骤,在后面对OpenCV进行make操作时,会出现如下错误:


    OpenCV 进行 make 操作的错误

    四、OpenCV的交叉编译

    1、获取OpenCV源码

    笔者这里使用的是OpenCV 2.4.9版本,可以在官网上下载。
    官网下载地址:http://opencv.org/releases.html

    2、设置工具链toolchain.cmake

    下载并解压OpenCV后,进入OpenCV 2.4.9的路径,并新建文件夹build:

    cd opencv-2.4.9
    mkdir build
    cd ./build
    

    在build文件夹中,用vim或gedit新建文件<code>toolchain.cmake</code>:

    gedit toolchain.cmake
    

    在<code>toolchain.cmake</code>文件中填入如下内容:

    ###########user defined#############
    set( CMAKE_SYSTEM_NAME Linux )
    set( CMAKE_SYSTEM_PROCESSOR arm )
    set( CMAKE_C_COMPILER arm-none-linux-gnueabi-gcc )
    set( CMAKE_CXX_COMPILER arm-none-linux-gnueabi-g++ )
    ###########user defined#############
    set( CMAKE_FIND_ROOT_PATH "/usr/local/arm/opencv-depend" )
    set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
    set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
    set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
    ######################################
    

    保存文件后,执行如下命令:

    cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ../
    

    3、对OpenCV进行cmake配置

    后面就会需要对OpenCV进行cmake操作,如果PC机没有安装cmake,则需要输入指令:

    apt-get install cmake cmake-qt-gui
    

    依旧在<code>build</code>路径下,打开<code>cmake</code>的界面程序,即输入指令:

    cmake-gui
    

    设置源代码地址为<code>/opencv-2.4.9</code>,构建地址为<code>/opencv-2.4.9/build</code>,并对如下选项进行修改:

    • CMAKE_INSTALL_PREFIX(安装目录),默认为/opencv-2.4.9/build/install,改为/usr/local/arm/opencv-install
    • 去掉 WITH_CUDA
    • 去掉 WITH_GTK
    • 去掉 WITH_1394
    • 去掉 WITH_GSTREAMER
    • 去掉 WITH_LIBV4L
    • 去掉 WITH_TIFF
    • 去掉 BUILD_OPENEXR
    • 去掉 WITH_OPENEXR
    • 去掉 BUILD_opencv_ocl
    • 去掉 WITH_OPENCL

    OpenCV修改项众多,可以利用<code>cmake-gui</code>的搜索功能简化操作。修改界面如图所示:


    cmake-gui

    将上述操作进行完毕后,先按下Configure,然后按下Generate。

    此时修改在<code>/opencv-2.4.9/build</code>文件夹中的<code>CMakeCache.txt</code>:
    CMAKE_EXE_LINKER_FLAGS选项本来为空,此时在后面加上:<code>-lpthread -lrt</code>
    效果如图所示:


    CMakeCache.txt 文件修改

    4、编译OpenCV

    在<code>/opencv-2.4.9/build</code>路径下执行命令:

    make
    make install
    

    等待较长时间后,OpenCV的交叉编译就完成了。

    五、交叉编译后的OpenCV移植到ARM上

    1、配置pkg-config

    参考地址:http://blog.csdn.net/luotuo44/article/details/24836901
    大家应该都知道用第三方库,就少不了要使用到第三方的头文件和库文件。我们在编译、链接的时候,必须要指定这些头文件和库文件的位置。
    对于一个比较大第三方库,其头文件和库文件的数量是比较多的。如果我们一个个手动地写,那将是相当麻烦的。所以,pkg-config就应运而生了。pkg-config能够把这些头文件和库文件的位置指出来,给编译器使用。
    平常都是这样用pkg-config的:

    gcc main.c `pkg-config --cflags --libs gtk+-2.0` -o main
    

    上面的编译命令中,<code>`pkg-config --cflags --libs gtk+-2.0`</code>的作用就如前面所说的,把gtk的头文件路径和库文件列出来,让编译去获取。--cflags和--libs分别指定头文件和库文件。
    <font color=red>PS:命令中的`不是引号,而是数字1左边那个键位的那个符号。</font>

    在前面的OpenCV配置过程中,pkg-config便已经生成。生成地址为<code>/usr/local/arm/opencv-install/lib/pkgconfig/opencv.pc</code>

    2、配置shell

    用vim或gedit编辑文件<code>/etc/bash.bashrc</code>:

    gedit /tec/bash.bashrc
    

    在最后一行加入:
    <code>
    PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/arm/opencv-install/lib/pkgconfig
    export PKG_CONFIG_PATH
    </code>
    效果如图所示:


    配置 shell

    然后输入指令:

    source /etc/bash.bashrc
    

    这样就更新了这一条配置信息,不需要再重新启动了。

    3、测试使用

    创建并编辑一个<code>test.cpp</code>文件:

    #include <cv.h>
    #include <highgui.h>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        IplImage* image = cvLoadImage("/root/Desktop/miska.jpg");
        if(image == NULL)
        {
            cout<<"loud image fail"<<endl;
        return -1;
        }
    
        cvNamedWindow("src", 1);
        cvShowImage("src", image);
        cvWaitKey();
        
        cvDestroyWindow("src");
        cvReleaseImage(&image);
     
        return 0;
    }
    

    保存退出后,输入如下编译指令:

    arm-linux-g++ `pkg-config --cflags --libs opencv` test.cpp -lpthread -lrt -o test
    

    <font color=red>再注:命令中的`不是引号,而是数字1左边那个键位的那个符号。</font>

    以后编译arm板的OpenCV代码时,要使用上面的编译指令。其中` 符号不是逗号,而是1 左边的那个符号。而把编译好的程序放到arm板时,在运行时,还要把/usr/local/arm/opencv-install/lib目录下的所有.so文件都拷贝到arm的/usr/lib或者/lib目录下。

    相关文章

      网友评论

          本文标题:Ubuntu 14.04 LTS下使用arm-linux-gcc

          本文链接:https://www.haomeiwen.com/subject/aurjjftx.html