我正在尝试运行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
任何帮助都会非常感激,因为我现在不知道该怎么做。
答案 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,有一个更容易的选择。你的错误在于联系
libswresample
(libswresample.a
)的静态版本而不是。{
共享版本(libswresample.so
),这将是PIC。纠正那个错误。如果你安装
来自包管理器提供的开发包的libswresample.a
它还将提供libswresample.so
。如果您已构建libswresample
从源代码开始,构建系统也将构建两者。