Opencv-3.4.14 及 Opencv-contrib 交叉编译详细记录

工具链

工具链是导师已经给好了,他直接给我了一个环境,让我在虚拟机里进行交叉编译。那么这一段就不详细叙述了。使用Vmware运行环境,下载opencv及contrib包,需要统一版本,然后将contrib解压到opencv文件夹中,并在其中建立build和install。

  • 需要注意的是,虚拟机的内存需要8G以上,4G肯定不够
  • 操作时最好一直使用root用户

cmake-gui

下载cmake-gui并打开,选择目录和build目录,点击configure,选第四个选项并继续,选择C和C++的交叉工具链,然后选择Targetroot,这个是输出文件夹。系统名称随便取就行。
Opencv-3.4.14 及 Opencv-contrib 交叉编译详细记录

  • 需要注意的是,TargetRoot并不一定与工具链路径一致,同时下面的三个选项需要设置正确,ProgramMode选择native

点击finish后,系统会对工具链进行测试(大概),如果选择错误有可能会出invalid错误。
接下来设置OpenCV编译的参数,一些参数的设置需要在界面上部勾选advance,其中需要进行设置的包括以下内容:

  • CMAKE_C_FLAGS,CMAKE_CXX_FLAGS 设置 -fPIC,这个非常重要,如果不加会出现recompile with -fPIC的错误
  • CMAKE_EXE_LINKER_FLAGS 设置 -lpthread -ldl -lrt,这个并不知道重不重要
  • OPENCV_ENABLE_NONFREE 勾选,勾选后即可编译contrib库
  • OPENCV_EXTRA_MODULES_PATH,这里记录的是contrib库modules文件夹的位置,不填写的话勾选上面的也没用
  • CMAKE_INSTALL_PREFIX,填写install文件夹的位置
  • 之后可以取消勾选一些不需要的内容,比如WITH_TIFF等

处理完毕后点击configure,确认下载全部完成后点击generate,cmake-gui部分完成。
由于contrib需要下载一些墙外的文件,这里直接把我下好的压缩包发过来,如果是3.4.14版本可以使用。
这部分是boostdesc部分:
链接: https://pan.baidu.com/s/1SWxvU6xuiA8Kg6GxuRlYuw 密码: gfmo
用超级用户删除原本contrib文件夹中的downloads/xfeatures2d文件夹,然后用cp复制过去。
之后还需要下载一个face_landmark的文件。这里提供一个名为share的压缩包,解压后直接放在build中即可。
链接: https://pan.baidu.com/s/1xixW6kc9-nzDbTI5H6sD8g 提取码: s8zb

编译

输入sudo make -j12 进行编译。编译过程中必然会出现问题,这里还要注意的是,文件名不能有括号,上面的文件名有括号所以编译不了。
大概在5%时,我们会遇到第一个错误,也就是common.cc报的错误"No suitable threading library available."
解决方式:搜索common.cc,在common.cc中#define HAVE_PTHREAD
Opencv-3.4.14 及 Opencv-contrib 交叉编译详细记录
之后我们make clean,在继续make -j12
遇到的第二个错误是&&没有右值,因为我这里改过的原因,没有报这个错,我只能大致说下怎么改。
解决方式:找到报错文件并打开,找到出错语句:

#if defined FILE_OFFSET && FILE_OFFSET == 64 //印象里是这样,忘了宏的名字 

这句话出错的原因是这个宏有可能没有定义值,也有可能定义了值。
通过以下方式检测其是否定义了值:

#if (FILE_OFFSET - FILE_OFFSET - 1 != -1) //判断是否有值
#if (FILE_OFFSET == 64)
//此处填写中间行
#endif
#endif

之后如果遇到"recompile with -fPIC" 提示,说明CMAKE 的 FLAG没有添加-fPIC,在cmake-gui添加即可。
如果遇到工具链突然kill了自己,那就是因为内存不足,需要多分配虚拟内存。
那么我这个就是一马平川的编译完了,之后sudo make install即可。

如果有帮助点个赞可好

上一篇:树莓派修改国内源


下一篇:2021-05-02