我要努力工作,加油!

arm交叉编译opencv-3.4.0报错:gtypes.h:422:3

		发表于: 2019-12-16 14:37:00 | 已被阅读: 60 | 分类于: 杂谈
		

因为业务需求,需要在海思的 hi519(himix200 )平台交叉编译 opencv 库,因为钟爱 OpenCV-3.4.0,所以决定交叉编译之。

生成makefile

  1. 获取源码,可以到其官网下载相应的版本:https://opencv.org/releases/
  2. 执行下面经典的交叉编译过程:
$ unzip opencv-3.4.0.zip
$ cd opencv-3.4.0
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE       -D CMAKE_INSTALL_PREFIX=/lccRoot/programs/himix200/opencv-3.4.0-world      -D  CMAKE_C_COMPILER=arm-himix200-linux-gcc     -D  CMAKE_CXX_COMPILER=arm-himix200-linux-g++      -D BUILD_SHARED_LIBS=ON      -D BUILD_opencv_apps=OFF      -D BUILD_ZLIB=ON      -D BUILD_PNG=ON      -D BUILD_opencv_js=OFF      -D BUILD_TESTS=OFF      -D BUILD_ANDROID_EXAMPLES=OFF      -D BUILD_PACKAGE=OFF      -D BUILD_TESTS=OFF      -D BUILD_PERF_TESTS=OFF      -D ENABLE_PIC=TRUE      -D OpenCV_ARCH=AARCH64  -D BUILD_HIGHGUI=OFF -D WITH_GTK=OFF -D BUILD_CAROTENE=ON  -D BUILD_ZLIB=ON -D BUILD_opencv_world=OFF -D WITH_DSHOW=OFF ..

关于上述最后一条命令中的-D Build_xxx=ON/OFF, -D With_xxx之类的选项,可以查看 opencv-3.4.0/CMakeLists.txt。

这里稍稍说说-D BUILD_opencv_world=ON ,将此选项设置为ON,可以将 opencv 编译为一个“大库” libopencv_world,这样在开发时就只需链接它一个了,方便,但是部署可能就不太方便(不能根据需求只链接对应的库)。也可以将其设置为OFF,将opencv编译为功能独立的库。

报错

上述命令执行完毕后,即可得到 makefile,执行 make 命令编译之:

$ make -j

遗憾的是报错了:

/usr/include/glib-2.0/glib/gtypes.h: In function 'gboolean _GLIB_CHECKED_ADD_U64(guint64*, guint64, guint64)':
/usr/include/glib-2.0/glib/gtypes.h:422:3: error: size of array '_GStaticAssertCompileTimeAssertion_0' is negative
   G_STATIC_ASSERT(sizeof (unsigned long long) == sizeof (guint64));

交叉编译opencv-3.4.0出错信息

解决问题

观察出错原因,发现G_STATIC_ASSERT(sizeof (unsigned long long) == sizeof (guint64));很可疑,搜索guint64,发现其在 /usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h 文件中,打开之:

搜索guint64

原因很明显了,将黄框中的两个 typedef 修改为:

typedef signed long long gint64;                                                                                              
typedef unsigned long long guint64;

保存后,再次尝试编译 opencv,不出意外的继续报错了:

/bin/ld: cannot find -lgstbase-1.0
/bin/ld: cannot find -lgstreamer-1.0
/bin/ld: cannot find -lgobject-2.0
/bin/ld: cannot find -lglib-2.0
/bin/ld: cannot find -lgstvideo-1.0
/bin/ld: cannot find -lgstapp-1.0
/bin/ld: cannot find -lgstriff-1.0
/bin/ld: cannot find -lgstpbutils-1.0

报错

似乎是 glib-2.0 的原因,要是交叉编译它就麻烦了。仔细观察出错信息,发现是在编译videoio时 出错的,打开 CMakeListst.txt,搜索相关子库:

CMakeListst.txt

可见,videoio 适用于建立 DirectShow 支持的,我不需要这个支持,所以可以在 ../configure 阶段指定-D WITH_DSHOW=OFF关闭此子库的编译。按照这个思路,重新生成 makefile,再次执行

$ make -j
$ make install

就成功编译了。