2017-07-17 81 views
0

我试图运行LibSourcey来使用Webrtc Streaming Server。Libsourcey缺失-fPIC编译错误

事情是,我似乎无法使它的工作。 我努力在我的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 

任何帮助将是非常赞赏,因为我不知道现在该做什么。

回答

2

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

我结束了用标志重新编译FFmpeg来构建共享库。下面的代码示例框在FFmpeg Compilation Guide,添加以下两个标志到的./configure线在适用:

  • --enable-PIC

  • --enable共享

我删除了--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的构建,并且对所有的概念都不太确定。这只是对我有用,也许它会为你工作。

0

您有链接错误,而不是编译错误。你还没碰到一个bug, 你刚刚尝试了一个无法工作的链接。您正试图建立共享库libscy_av.so。在共享库中链接的所有对象 必须包含Position Independent Code。要使用gcc生成 这样的目标文件,可以使用选项-fPIC进行编译。

链接器发现您的共享库文件需要目标文件 options.o,它是静态库libswresample.a的成员。然后 发现这个options.o不是PIC,所以不能链接到 共享库。链接失败,链接程序建议您必须使用-fPIC编译器选项重新编译 options.o

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

您可能会这样做,但静态库中的目标文件以 为PIC并不常见,并且有一个更简单的选项。您的错误是与 静态版本libswresamplelibswresample.a)链接,而不是 共享版本(libswresample.so),这将是PIC。纠正那个错误。如果您从软件包管理器提供的开发包安装了 libswresample.a,那么它还将提供libswresample.so。如果您已经从源代码构建了libswresample ,那么构建系统也将构建两者。