Libsourcey 缺少-fPIC 编译错误
Libsourcey missing -fPIC compilation error
我正在尝试 运行 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
任何帮助将不胜感激,因为我现在不知道该怎么做。
你有链接错误,不是编译错误。你还没有 运行 遇到错误,
您刚刚尝试了一个无法工作的链接。
您正在尝试构建共享库 libscy_av.so
。所有对象
在共享库中链接的文件必须包含 Position Independent
代码。生成
这样一个带有 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
从源代码,然后构建系统也将构建两者。
我在 Ubuntu 16.04
上遇到了同样的错误。
我最终使用标志重新编译 FFmpeg 以构建共享库。按照 FFmpeg Compilation Guide 中的代码示例框,我将以下两个标志添加到 ./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
Note the last two lines in my example are different than the FFmpeg
guide.
完成所有这些操作后,最好删除 Libsourcey 源和构建文件夹,然后重新开始。
我花了大约 4-5 天的时间才最终编译并成功构建了具有 FFmpeg 和 WebRTC 依赖项的 Libsourcey。我也遇到了其他一些障碍,所以如果您有其他问题,请务必标记我。注意:我对 Linux 建筑一窍不通,对所有概念都不扎实;这正是对我有用的,也许对你也有用。
我正在尝试 运行 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
任何帮助将不胜感激,因为我现在不知道该怎么做。
你有链接错误,不是编译错误。你还没有 运行 遇到错误, 您刚刚尝试了一个无法工作的链接。
您正在尝试构建共享库 libscy_av.so
。所有对象
在共享库中链接的文件必须包含 Position Independent
代码。生成
这样一个带有 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
从源代码,然后构建系统也将构建两者。
我在 Ubuntu 16.04
上遇到了同样的错误。
我最终使用标志重新编译 FFmpeg 以构建共享库。按照 FFmpeg Compilation Guide 中的代码示例框,我将以下两个标志添加到 ./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
Note the last two lines in my example are different than the FFmpeg guide.
完成所有这些操作后,最好删除 Libsourcey 源和构建文件夹,然后重新开始。
我花了大约 4-5 天的时间才最终编译并成功构建了具有 FFmpeg 和 WebRTC 依赖项的 Libsourcey。我也遇到了其他一些障碍,所以如果您有其他问题,请务必标记我。注意:我对 Linux 建筑一窍不通,对所有概念都不扎实;这正是对我有用的,也许对你也有用。