Libsourcey缺少-fPIC编译错误

时间:2017-07-17 13:20:02

标签: shared-libraries webrtc fpic libsourcey

我正在尝试运行LibSourcey以使用Webrtc Streaming Server。

事情是,我似乎无法使其发挥作用。 我努力在我的Ubuntu 16.04(cmake文件中的Regexp)上编写项目,但现在已经修复了。 我实际得到的问题是编译时的共享对象错误:

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

任何帮助都会非常感激,因为我现在不知道该怎么做。

2 个答案:

答案 0 :(得分:2)

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

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

  • - enable-pic

  • - 启用共享

我也删除了--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大楼的noob,并不是所有概念都很扎实;这对我有用,也许它对你有用。

答案 1 :(得分:0)

您有链接错误,而不是编译错误。你还没碰到一个bug, 你刚刚尝试过无法正常工作的联系。

您正在尝试构建共享库libscy_av.so。所有的对象 共享库中链接的文件必须包含Position Independent Code。生成 使用gcc这样的目标文件,可以使用选项-fPIC进行编译。

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

要遵守该建议,您必须从源重建静态库libswresample.a,并在编译器标志中添加-fPIC

您可能会这样做,但静态库中的目标文件不常见 是PIC,有一个更容易的选择。你的错误在于联系 libswresamplelibswresample.a)的静态版本而不是。{ 共享版本(libswresample.so),这将是PIC。纠正那个错误。如果你安装 来自包管理器提供的开发包的libswresample.a 它还将提供libswresample.so。如果您已构建libswresample 从源代码开始,构建系统也将构建两者。