在 Ubuntu 18.04 上安装 opencv(任何版本)时出错

在 Ubuntu 18.04 上安装 opencv(任何版本)时出错

make我在opencv 中的命令中遇到错误。

[/usr/bin/ld: /usr/local/lib/libavcodec.a(vc1dsp_mmx.o): relocation R_X86_64_PC32 against symbol `ff_pw_9' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
modules/videoio/CMakeFiles/opencv_videoio.dir/build.make:446: recipe for target 'lib/libopencv_videoio.so.4.5.0' failed
make[2]: *** [lib/libopencv_videoio.so.4.5.0] Error 1
CMakeFiles/Makefile2:8437: recipe for target 'modules/videoio/CMakeFiles/opencv_videoio.dir/all' failed
make[1]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2
Makefile:162: recipe for target 'all' failed
make: *** [all] Error 2

答案1

此错误意味着系统中存在的 libavcodec(直接安装在您的系统上或通过 FFmpeg 间接安装)库未构建为“共享库”。并且 OpenCV 由默认有一个 cmake(配置)选项构建共享库作为在大多数平台和 Ubuntu 18.04 上,它的。您至少有 3 个选项可以解决这个问题:

  • 通过设置 OpenCV 的 cmake 配置将 OpenCV 配置为静态BUILD_SHARED_LIBS=关闭执行 make 之前如下:

      cmake -DBUILD_SHARED_LIBS=OFF ../opencv && make
    
  • 不使用 FFmpeg 配置和构建 OpenCV(是个默认通过设置 OpenCV 的 cmake 配置,在大多数平台(包括 Ubuntu 18.04)上启用构建选项WITH_FFMPEG=OFF执行 make 之前如下:

      cmake -DWITH_FFMPEG=OFF ../opencv && make
    
  • 将 libavcodec 构建为“共享库”。但是,libavcodec 是 FFmpeg 的一部分,我只知道如何与 FFmpeg 一起构建它。您可以尝试寻找将 libavcodec 单独构建为共享库的方法,而无需构建 FFmpeg 附带的所有附加功能,尽管我不确定 OpenCV 是否需要 FFmpeg 的其余部分,因为我只尝试与 OpenCV 一起构建整个 FFmpeg 包。任何更了解的人,请随意编辑此答案。由于 FFmpeg 经常与其他库一起构建,因此我将构建 libx264 作为共享库的步骤作为示例。其他库可能具有类似的配置步骤来将其构建为共享库。--enable-libx264如果您不需要 FFmpeg 中的 x264 编码支持,您可以忽略第一行命令以及 FFmpeg 配置中的选项。在这里,我将在系统范围内安装 X264 和 FFmpeg 库,但您可能希望安装到本地文件夹:

      git clone https://code.videolan.org/videolan/x264.git && cd x264 && git checkout remotes/origin/stable && ./configure --enable-shared && make -j12 && sudo make install-lib-shared -j12 && cd ../;
      git clone https://github.com/FFmpeg/FFmpeg.git && cd FFmpeg && git checkout remotes/origin/release/4.3 && ./configure --enable-gpl --enable-libx264 --enable-shared && make -j12 && sudo make install -j12 && cd ../;
      git clone https://github.com/opencv/opencv.git && cd opencv && git checkout 1363496 && mkdir build && cd build && mkdir install && cmake -DBUILD_SHARED_LIBS=ON ../ && cmake --build . --target install -- -j12 ;
    

上面的命令../opencv是 OpenCV 源代码根目录的路径,命令正在临时构建目录中执行。有关更多指导,请参阅这里。此外,我已经检查了截至该答案原始日期的每个软件包的最新稳定发行版本。

答案2

当您启用内联汇编程序时,如果您想使用静态构建的ffmpeg库,则必须使用

-Wl,-Bsymbolic

链接您自己的共享库时。您可以在线搜索以查找原因,但解释不适合答案。

相关内容