【问题标题】:Libsourcey missing -fPIC compilation errorLibsourcey 缺少 -fPIC 编译错误
【发布时间】:2017-07-17 13:20:02
【问题描述】:

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

问题是我似乎无法让它工作。 我努力在我的 Ubuntu 16.04(cmake 文件中的正则表达式)上 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

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

【问题讨论】:

    标签: shared-libraries webrtc fpic libsourcey


    【解决方案1】:

    我在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 构建的菜鸟,对所有概念都不是很了解;这正是对我有用的方法,也许对你有用。

    【讨论】:

      【解决方案2】:

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

      您正在尝试构建共享库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 从源代码,然后构建系统也将构建两者。

      【讨论】:

        猜你喜欢
        • 2013-08-11
        • 2013-01-10
        • 1970-01-01
        • 2014-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-10
        相关资源
        最近更新 更多