交叉编译opencv时候ffmpeg选项始终为no的解决方法

没想到开通博客的第一篇博客竟然是送给交叉编译的……特以此文致敬在编译路上渐行渐远的程序员们。

转载请注明出处。


-------------------------------------------------------------------------------------分割线------------------------------------------------------------------------------------------


问题来自于在一次在arm开发板上使用opencv的cv::VideoCapture类的open()方法来打开视频文件时候,总是无法成功打开文件,我使用的opencv是3.2.0版的。经过排查,确定是由于没有把ffmpeg模块编译进去导致视频文件读取失败的。下图是编译opencv时候的cmake配置界面(不熟悉cmake的朋友可以先看看网上前辈们的教程,很详细)。

这里出现一个很奇怪的问题,明明上面选择了WITH_FFMPEG,而且对应的库也都找到了,但是在configure之后FFMPEG一直是NO,而且这个问题只有在选择交叉编译工具链之后出现,使用PC的本地编译工具链就没有问题。网上查看configure输出的时候发现如下图的问题。

这里出现一个warning,说FFMPEG的test代码没有构建成功,于是就去查看CMakeList.txt。发现下图的代码片段。原来除了WITH_FFMPEG之外,还有一个HAVE_FFMPEG来打印是否含有FFMPEG模块,于是继续搜索这两个宏的作用。

之后找到了如下图的代码段。原来在定义了HAVE_FFMPEG宏之后,opencv的构建脚本要尝试去编译"${OpenCV_SOURCE_DIR}/cmake/checks/ffmpeg_test.cpp"代码,如果编译通过才会把这个宏置为有效,否则就认为没有相应的FFMPEG的库。

"${OpenCV

在上图中还有一个宏“PKG_CONFIG_FOUND”宏,后文会分析这个宏,先在这里记下。上图的代码也指定了FFMPEG的路径(FFMPEG_INCLUDE_DIRS),然后搜索FFMPEG_INCLUDE_DIRS,发现入下图所示。

这个路径是本地FFMPEG的路径,根本不是交叉编译生成的FFMPEG的库的路径,用交叉编译工具去调用本地的库肯定编译通不过!!!!!

然后就思考为什么会出现这个情况,此时前文提到的PKG_CONFIG_FOUND就有用了。通过查找这个宏,发现opencv构建脚本是用pkg-config来超找一些模块的路径的。原来在编译FFMPEG库的时候,在执行"make install"时候会在prefix指定的路径下的lib文件夹里面生成一个pkgconfig文件夹,pkgconfig文件夹里面包含了一个或者一些.pc文件,这些就是库的配置文件(可以打开pc文件查看)。因此只需要把FFMPEG库对应的pgkconfig文件夹下的pc文件放到pkg-config的查找路径下就行了,我的是在/usr/lib/x86_64-linux-gnu/pkgconfig。

重新编译的opencv库就可以在板子上使用了。

第一次写博客,时间匆忙,如果有不对的地方,欢迎大佬们指正!

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值