opencv arm-linux交叉编译

opencv arm-linux交叉编译

opencv2.4.13

该版本按照opencv官方文档编译,提示CMAKE_MAKE_PROGRAM is not set,或No CMAKE_CXX_COMPILER could be found,原来是还需要g++编译器,文档漏掉了,参考这里
apt-get install g++-arm-linux-gnueabihf

修改platform/linux/arm-gnueabi.toolchain.cmake,改为如下:

  1. set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version"),也就是去掉版本号。
  2. set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-gcc),也就是使用绝对路径,去掉后面的杠和版本号。当然编译器路径添加到PATH也行。

执行cmake:

cmake -DCMAKE_MAKE_PROGRAM:PATH=/usr/bin/make -DCMAKE_INSTALL_PREFIX=arm-install -DCMAKE_TOOLCHAIN_FILE=../arm-gnueabi.toolchain.cmake ../../..

CMAKE_MAKE_PROGRAM 指定绝对路径。CMAKE_INSTALL_PREFIX指定安装目录,目录下的lib就是我们要拷贝到arm上的库。

最后成功编译。

编译opencv测试程序

重命名安装目录/lib/pkgconfig下的opencv.pc为arm-opencv.pc,编辑文件,Name项改为arm-opencv.

修改/etc/bash.bashrc :

vim /etc/bash.bashrc 

添加:opencv安装目录/lib/pkgconfig

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:arm-install/lib/pkgconfig
Export PKG_CONFIG_PATH
source /etc/bash.bashrc  

测试程序:

#include "opencv/cv.h"
#include "opencv/highgui.h"
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
    IplImage* image = cvLoadImage("test.png");
    if(image == NULL)
    {
        cout<<"loud image fail"<<endl;
	    return -1;
    }

    cout<<""<<image->width<<endl;
    cvReleaseImage(&image);
    return 0;
}

编译:

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

报错:undefined reference to cvLoadImage',执行pkg-config --cflags --libs arm-opencv`,显示路径没问题

最后调整命令顺序编译成功,真的坑。

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

执行测试程序

报错:/usr/lib/libstdc++.so.6:version "GLIBCXX_3.4.21" not found,在ubuntu上交叉编译工具目录下找到对应库替换即可,即/usr/arm-linux-gnueabihf/lib下找到libstdc++.so.6、libstdc++.so.6.0.21,拷贝到开发板/usr/lib目录下,执行测试程序,输出正确。

总结

交叉编译opencv很烦人,总会遇到各种各样的错误,有的人干脆直接在arm版上编译程序,省去很多麻烦,编译速度也不会很慢。之所以错误不断,是因为机器的各种库版本不尽相同,比如我们已经安装了linux版opencv,环境变量里也有了一些配置,arm版编译的时候可能就会链接错误,还有交叉编译工具、gcc、g++编译器版本等各种差别。相信如果在全新机器上编译,应该没这么多问题。最重要的一点,我们如果不理解各种操作所代表的含义,只是照搬网上的,出了问题第一时间又像无头苍蝇样的到处找答案,这样是很难搞通的,也不会有太多长进。理解各种命令的含义,执行命令报错知道检查相关的配置,学习编写makefile,才能彻底解决问题。
学习makefile,参考:Makefile教程跟我一起写 Makefile.

原文链接: https://www.cnblogs.com/leafdance/p/11178990.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    opencv arm-linux交叉编译

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/298685

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月15日 下午8:05
下一篇 2023年2月15日 下午8:05

相关推荐