工作需要,现在需要在ARM开发板进行C++的图像处理环境搭建。
以前都是在Anaconda或者Pycharm上使用Python进行操作,第一次在Linux上基于C++操作,沿途采坑无数,遂记录一下,也方便以后复现。
开始之前先说一下交叉编译的好处:嵌入式设备普遍存储空间不大,如果在嵌入式设备进行大量编译操作很容易造成空间不足,并且浪费时间。最近由于工作需要,需要在Toybrick的RK3399PRO_X上运行OpenCV,直接编译一个调用相机的简单程序耗时超过两小时,遂在X86 PC端进行交叉编译,然后将编译好的文件拷贝到ARM设备。
第一步:安装交叉编译器
以gcc-aarch64-linux-gnu为例
1. Linux X86下安装ARM架构编译器
sudo apt-get install g++-aarch64-linux-gnu
sudo apt-get install gcc-aarch64-linux-gnu
下载后在终端输入以下指令查看编译器版本
aarch64-linux-gnu-g++ -v
aarch64-linux-gnu-gcc -v
第二步:OpenCV交叉编译
下载OpenCV,我这里使用的是OpenCV3.4,从OpenCV的Github页面直接下载。
opencv的交叉编译工具链在../opencv3.2.0/platforms/linux 路径下,linux文件夹下是一些.cmake文件,对应不同的移植对象,本人需要在Toybrick的RK3399PRO_X部署模型,所以选择aarch64-gnu.toolchain.cmake 工具链。通过arch指令查看自己的CPU架构。
在进行编译前,需要修改cmake文件,因为是aarch64,则修改platform/linux/aarch64-gnu.toolchain.cmake,改为如下:
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version")
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)
set(GNU_MACHINE "aarch64-linux-gnu" CACHE STRING "GNU compiler triple")
include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake")
接下来执行交叉编译。首先在OpenCV3.4下新建文件夹 aarch_64_install和build,进入build,在终端执行如下命令:
sudo cmake -DCMAKE_MAKE_PROGRAM:PATH=/usr/bin/make -DCMAKE_INSTALL_PREFIX=../aarch_64_install -DWITH_CUDA=OFF -DENABLE_PRECOMPILED_HEADERS=OFF -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/aarch64-gnu.toolchain.cmake -DCUDA_GENERATION=Kepler ..
-DCMAKE_INSTALL_PREFIX 指定编译文件make install后保存路径。然后运行:
make -j4
make install
编译结束后进入aarch_64_install文件夹,里面已经生成了bin, include, lib, share四个文件夹。
踩坑1:编译过程报错
解决办法:多线程错误,尝试直接make,不要-j4
第三步:Linux上生成ARM架构下可执行文件
创建测试用test.cpp,内容如下
#include <opencv2/opencv.hpp>
using namespace cv;
int main( int argc, char** argv )
{
Mat image;
image = imread( "7.bmp", 1 );
if( !image.data )
{
printf( "No image data \n" );
return -1;
}
cv::Point lu = cv::Point(180, 60);
cv::Point rd = cv::Point(400, 260);
cv::rectangle(image, lu, rd, cv::Scalar( 255, 20, 0 ), 1, CV_AA );
imwrite("8.bmp", image);
return 0;
}
在终端执行:
/usr/bin/aarch64-linux-gnu-g++ -o draw_image test.cpp -I ../aarch_64_install/include/ ../aarch_64_install/lib/libopencv_core.so ../aarch_64_install/lib/libopencv_imgcodecs.so ../aarch_64_install/lib/libopencv_imgproc.so
在test.cpp同一目录下会生成可执行文件 draw_image,利用file draw_image检查可执行文件格式是否支持arrch64。输出为:
draw_image: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=42f4ae7c66a0875bc0d49e4195ff35aa08f15cbe, not stripped
出现如上结果说明可执行文件支持ARM arrch64
第四步:移植ARM端执行
将aarch_64_install文件夹下的include和lib里的文件分别拷贝到ARM板的/usr/include 和/usr/lib下 然后打开终端执行可执行文件即可。
踩坑2:报错Libopencv_core so 3.4 cannot open shared object file: No such file or directory
原因是OpenCV的当前安装目录为/usr/local/lib下,而读取的位置为/usr/lib下。因此需要将复制过来的lib和include文件夹复制到/user/中。
sudo cp -r lib /usr/
sudo cp -r include /usr/
踩坑3:也是耽误我最久的坑!/lib/aarch64-linux-gnu/libc.so.6 version glibc_2.29′ not found
这是由于缺少GLIBC对应版本引起的。笔者一开始是在Ubuntu20.04上编译,复制到Toybrick的Debian10上运行。编译的环境为2.29而运行环境最高只支持到2.28。可以通过如下指令查询GLIBC版本:
strings /lib/aarch64-linux-gnu/libc.so.6 | grep GLIBC
系统对应的GLIBC版本可以在这个网站查询:
Libc6 Download (DEB, RPM) (pkgs.org)
更换为了Ubuntu18.04进行交叉编译,重复步骤3,4,问题解决!
踩坑4:如果使用最新OpenCV4,会报错:fatal error: opencv2/opencv.hpp: No such file or directory
这是由于OpenCV4的文件结构发生了变化。opencv头文件的路径中多了一个opencv4的文件夹:/usr/include/opencv4/opencv2。旧版本是/usr/include/opencv2
- 可以将opencv2拷贝到自己的include文件夹
- 可以将opencv2文件夹链接到include文件夹下,进行如下操作:
sudo ln -s /usr/include/opencv4/opencv2 /usr/include/
最后附上成功运行的结果!
参考:
Linux交叉编译opencv并移植ARM端
https://zhuanlan.zhihu.com/p/381760569
在ubuntu下编译opencv程序后,执行报下面到错误: error while loading shared libraries: libopencv_core.so.2.4: cannot op
https://blog.csdn.net/u010925447/article/details/72998414
Problema – GLIBC_2.29 not found – Actualiza tu sistema
https://www.youtube.com/watch?v=Ozz23mg4wOM
linux libc 2.23.so,解决 /lib64/libc.so.6: version `GLIBC_2.14′ not found 的问题
https://blog.csdn.net/weixin_28728443/article/details/116893934?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164264199616780271556554%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164264199616780271556554&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-6-116893934.first_rank_v2_pc_rank_v29&utm_term=%2Flib%2Faarch64-linux-gnu%2Flibc.so.6+version+glibc_2.28+not+found&spm=1018.2226.3001.4187
【opencv4】——fatal error: opencv2/opencv.hpp: No such file or directory #include <opencv2/opencv.hpp>
https://blog.csdn.net/u011622208/article/details/115208377
文章评论