Libsourcey missing -fPIC 编译错误



我正在尝试运行LibSourcey以使用Webrtc流服务器。

问题是我似乎无法让它工作。 我努力在我的 Ubuntu 16.04(cmake 文件中的正则表达式(上制作该项目,但现在它已修复. 我实际遇到的问题是编译时的共享对象错误:

usr/bin/ld: /home/kimmie/ffmpeg_build/lib/libswresample.a(options.o): 
relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; 
recompile with -fPIC
/home/kimmie/ffmpeg_build/lib/libswresample.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
av/CMakeFiles/av.dir/build.make:783: recipe for target 'av/libscy_av.so.1.0.2' failed

任何帮助将不胜感激,因为我现在不知道该怎么办。

我在Ubuntu 16.04上遇到了同样的错误。

我最终用标志重新编译了 FFmpeg 来构建共享库。按照 FFmpeg 编译指南中的代码示例框,我在适用的情况下将以下两个标志添加到 ./configure 行中:

-
  • -启用图片

  • -
  • -启用共享

我也删除了--disable-shared标志。

我为每个组件添加了--enable-pic--enable-shared,如果它返回该组件无法识别的消息,则删除该标志。至少 libx264、libfdk-acc 和 libmp3lame 需要 --enable-shared。然后对于最终的FFmpeg(从上面链接的FFmpeg指南复制并粘贴(:

PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure 
--prefix="$HOME/ffmpeg_build" 
--pkg-config-flags="--static" 
--extra-cflags="-I$HOME/ffmpeg_build/include" 
--extra-ldflags="-L$HOME/ffmpeg_build/lib" 
--bindir="$HOME/bin" 
--enable-gpl 
--enable-libass 
--enable-libfdk-aac 
--enable-libfreetype 
--enable-libmp3lame 
--enable-libopus 
--enable-libtheora 
--enable-libvorbis 
--enable-libvpx 
--enable-libx264 
--enable-libx265 
--enable-nonfree 
--enable-pic 
--enable-shared

请注意,我示例中的最后两行与 FFmpeg 不同 指导。

完成所有这些操作后,最好删除 Libsourcey 源代码和构建文件夹并重新开始。

我花了大约 4-5 天的时间才最终编译并成功构建了使用 FFmpeg 和 WebRTC 依赖项构建 Libsourcey。我也遇到了其他一些障碍,所以如果你有其他问题,一定要标记我。注意:我是 Linux 构建的菜鸟,对所有概念都不扎实;这就是对我有用的东西,也许它会对你有用。

您有链接错误,而不是编译错误。你没有遇到错误, 您刚刚尝试了无法工作的链接。

您正在尝试构建共享库libscy_av.so。所有对象 共享库中链接的文件必须包含 位置无关 法典。要生成 这样的带有 GCC 的对象文件,您可以使用选项-fPIC进行编译。

链接器发现共享库需要对象文件options.o,它是静态库libswresample.a的成员。然后它 发现此options.o不是 PIC,因此无法在 共享库。链接失败,链接器建议您 必须使用-fPIC编译器选项重新编译options.o

为了遵守该建议,您必须从源代码重新生成静态库libswresample.a,并将-fPIC添加到编译器标志中。

您可能会这样做,但静态库中的对象文件不常见 是 PIC,还有一个更简单的选择。你的错误是链接到libswresample(libswresample.a( 的静态版本,而不是 共享版本 (libswresample.so(,这将是 PIC。只要纠正这个错误。如果您安装 从包管理器提供的开发包中libswresample.a,然后 它还将提供libswresample.so.如果您已构建libswresample从源代码,然后构建系统也将构建两者。

相关内容

最新更新