配置和构建OpenCV到自定义FFMPEG安装

时间:2012-09-14 15:51:05

标签: linux opencv linker ffmpeg shared-libraries

我似乎无法将OpenCV配置为链接到{/ 1}}库的非/ usr / lib集。

我的LD_LIBRARY_PATH包含指向自定义安装FFMPEG的文件夹的直接链接:

FFMPEG

此外,我已将pkgconfig配置为:

LD_LIBRARY_PATH=/pathto/ffmpeg-0.10.2/lib

然而,在CMake中,我无法找到FFMPEG路径的任何设置 - 无论是基本还是自定义。与FFMPEG相关的唯一设置似乎是PKG_CONFIG_PATH=/samepathto/ffmpeg-0.10.2/lib/pkgconfig/类型设置(设置为ON)。

我可以构建OpenCV,但它似乎链接到libavcodec的系统库 - 这会导致冲突,因为系统库是版本.52而我安装的WITH_FFMPEG中的版本是.53。在没有相同系统库的计算机上链接应用程序似乎没有链接到我自定义的OpenCV安装(特别是libavcodec),因为这(我在共享网络文件夹上安装这些库)。

我不确定我的问题是建立和链接到错误的FFMPEG版本,还是构建后(或链接到错误的ffmpeg)环境中的问题。

我在Linux,Redhat 6,OpenCV 2.3.1上构建。

3 个答案:

答案 0 :(得分:1)

对于OpenCV 3.x和ffmpeg 3.x,我必须应用以下补丁

diff --git a/cmake/OpenCVFindLibsVideo.cmake b/cmake/OpenCVFindLibsVideo.cmake
index 13b62ac..bab9df3 100644
--- a/cmake/OpenCVFindLibsVideo.cmake
+++ b/cmake/OpenCVFindLibsVideo.cmake
@@ -228,6 +228,12 @@ if(WITH_FFMPEG)
     if(FFMPEG_libavresample_FOUND)
       ocv_append_build_options(FFMPEG FFMPEG_libavresample)
     endif()
+   CHECK_MODULE(libavcodec HAVE_FFMPEG)
+   CHECK_MODULE(libavformat HAVE_FFMPEG)
+   CHECK_MODULE(libavutil HAVE_FFMPEG)
+   CHECK_MODULE(libswscale HAVE_FFMPEG)
+   CHECK_MODULE(libswresample HAVE_FFMPEG)
+   CHECK_MODULE(libavresample HAVE_FFMPEG)
     if(HAVE_FFMPEG)
       try_compile(__VALID_FFMPEG
           "${OpenCV_BINARY_DIR}"

使用以下脚本构建

#!/bin/bash

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/Applications/ffmpeg/lib
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$HOME/Applications/ffmpeg/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:$HOME/Applications/ffmpeg/lib

cmake \
    -D BUILD_EXAMPLES=ON \
    -D BUILD_TESTS=OFF \
    -D OPENCV_EXTRA_EXE_LINKER_FLAGS="-Wl,-rpath,$HOME/Applications/ffmpeg/lib" \
    -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=$HOME/Applications/opencv \
    /path/to/opencv

此外,当构建ffmpeg时,我必须启用标志--enable-avresample

答案 1 :(得分:1)

问这个问题已经有好几年了,但是我最近遇到了这个问题中描述的各种问题!我想添加我的输入。

首先:我只构建了静态ffmpeg库(出于某种原因),opencv的构建过程对此有些敌视。 opencv开发人员曾发表过文章,指出他们不支持针对静态ffmpeg库的opencv构建,但我的想法是“如果您还要构建静态opencv库,那该怎么办?当然应该支持吗?”

答案是,您可以针对静态ffmpeg库编译静态opencv库!我使用针对ffmpeg 4.2的opencv 4.1.1做到了这一点。我不得不使用以下cmake选项:

cmake3 \
-D BUILD_opencv_apps=OFF \
-D BUILD_opencv_python2=OFF \
-D BUILD_SHARED_LIBS=OFF \
-D WITH_FFMPEG=ON \
-D OPENCV_FFMPEG_SKIP_BUILD_CHECK=ON \

这些选项会生成一组opencv静态库,其中包括您还构建的所有ffmpeg静态库,并假设您将PKG_CONFIG_PATH设置为正确找到那些库(或者如果您已将它们安装到某个默认系统位置)

问题/答案:

  • 我们为什么不能构建应用?
    • 即使仅构建静态库,opencv构建过程也假设您正在构建并链接共享库。这似乎是构建过程中的一个缺陷,而不是技术上的限制。也许有一天会解决的。
  • 什么是OPENCV_FFMPEG_SKIP_BUILD_CHECK标志?
    • ffmpeg的cmake流程中有一个步骤,其中使用与opencv其他应用程序相同的错误生成过程来构建和链接应用程序。从某种意义上说,该过程假定您在不需要共享库时进行链接,这是错误的。您可以自己执行相同的构建步骤,而进行此假设并创建一个有效的应用程序。因此,需要关闭此构建检查,以使opencv接受是的,实际上,它发现的任何静态库都可以使用。这是
  • 为什么要禁用python支持?
    • opencv python构建过程显式生成可由Python加载的共享库。
  • 这是否意味着即使使用静态库,您仍在构建测试套件?
    • 是的。但是我没有尝试运行它们

答案 2 :(得分:0)

除了安德烈的答案:

我发现(对于我的配置)opencv 4.1.1构建系统未正确添加ffmpeg库路径(尽管它确实设置了include目录。)我的解决方法是为这些路径提供以下cmake构建参数:

-DCMAKE_SHARED_LINKER_FLAGS=" -Wl,-rpath-link $FFMPEG_LIBDIR -L$FFMPEG_LIBDIR"
-DCMAKE_MODULE_LINKER_FLAGS=" -Wl,-rpath-link $FFMPEG_LIBDIR -L$FFMPEG_LIBDIR"
-DCMAKE_EXE_LINKER_FLAGS=" -Wl,-rpath-link $FFMPEG_LIBDIR -L$FFMPEG_LIBDIR"

其中$ FFMPEG_LIBDIR是ffmpeg库二进制文件的路径。 必须使用-rpath-link otpion,因为构建系统并未为我的ffmpeg安装提供所有必需的ffmpeg库参数。

检查模块/videoio/cmake/detect_ffmpeg.cmake,看起来FFMPEG也可以通过指定以下内容来强制接受用户提供的库路径:

-DHAVE_FFMPEG=ON
-DFFMPEG_INCLUDE_DIRS=(path to your ffmpeg include directories)
-DFFMPEG_LIBRARIES=(list of ffmpeg libraries, e.g. -lavcodec)

但是,如果执行此方法,则生成系统对FFMPEG显示“是”,但对各个模块显示“否”(没有进一步调试。)

某些用户会发现他们可能需要在链接器标志中提供--sysroot链接器参数,或将-DCMAKE_SYSROOT指定为构建参数

希望这对某人有帮助:)