arm交叉编译opencv-3.4.0报错:gtypes.h:422:3
发表于: 2019-12-16 14:37:00 | 已被阅读: 60 | 分类于: 杂谈
因为业务需求,需要在海思的 hi519(himix200 )平台交叉编译 opencv 库,因为钟爱 OpenCV-3.4.0,所以决定交叉编译之。
生成makefile
- 获取源码,可以到其官网下载相应的版本:https://opencv.org/releases/
- 执行下面经典的交叉编译过程:
$ 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));
解决问题
观察出错原因,发现G_STATIC_ASSERT(sizeof (unsigned long long) == sizeof (guint64));
很可疑,搜索guint64
,发现其在 /usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h 文件中,打开之:
原因很明显了,将黄框中的两个 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,搜索相关子库:
可见,videoio 适用于建立 DirectShow 支持的,我不需要这个支持,所以可以在 ../configure 阶段指定-D WITH_DSHOW=OFF
关闭此子库的编译。按照这个思路,重新生成 makefile,再次执行
$ make -j
$ make install
就成功编译了。