我似乎无法将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上构建。
答案 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设置为正确找到那些库(或者如果您已将它们安装到某个默认系统位置)
问题/答案:
答案 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指定为构建参数
希望这对某人有帮助:)