gcc 如何使用-fPIC重新编译

a6b3iqyw  于 2023-02-16  发布在  其他
关注(0)|答案(9)|浏览(261)

我试图在我的ARM Ubuntu机器上重新安装我的ffmpeg,在这个guide之后。不幸的是,当我编译一个使用这个库的程序时,我得到了下面的失败:

/usr/bin/ld: /usr/local/lib/libavcodec.a(amrnbdec.o): relocation R_ARM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libavcodec.a: could not read symbols: Bad value
collect2: ld returned 1 exit status

现在我想像编译器建议的那样用-fPIC重新编译它,但是我不知道怎么做。任何帮助都是感激的。

hpxqektj

hpxqektj1#

简单地说,这个错误意味着你 * 不能使用一个静态库来链接一个动态库 *。正确的方法是将一个libavcodec编译成一个.so而不是.a,这样你试图构建的另一个.so库就可以很好地链接。
最简单的方法就是在./configure选项中添加--enable-shared,或者你可以尝试完全禁用共享(或静态)库...你可以选择适合你的!

niwlg2el

niwlg2el2#

请查看this page.
您可以尝试使用以下命令全局添加标志:export CXXFLAGS="$CXXFLAGS -fPIC"

9w11ddsr

9w11ddsr3#

在configure步骤之后,你可能有一个makefile。在这个makefile中,在末尾查找CFLAGS(或类似的). puf -fPIC,然后再次运行make。换句话说,-fPIC是一个编译器选项,必须传递给编译器的某个地方。

lrpiutwd

lrpiutwd4#

我在为Android x86_64目标平台构建FFMPEG静态库(例如libavcodec. a)时遇到了这个问题(使用Android NDK clang)。当与我的库静态链接时,尽管所有FFMPEG C-〉目标文件(*. o)都使用-fPIC编译选项编译,但仍出现了这个问题:

x86_64/libavcodec.a(h264_qpel_10bit.o): 
requires dynamic R_X86_64_PC32 reloc against 'ff_pw_1023' 
which may overflow at runtime; recompile with -fPIC

仅libavcodec. a和libswscale. a出现此问题。
此问题的根源是FFMPEG具有针对x86 * 平台的汇编程序优化,例如,报告的问题原因位于libavcodec/h264_qpel_10bit.asm-〉h264_qpel_10bit.o。
当生成X86 - 64位静态库(例如libavcodec. a)时,它看起来像汇编程序文件(例如libavcodec/h264_qpel_10bit.asm)使用了一些x86(32位)汇编程序命令,这些命令在与x86 - 64位目标库静态链接时不兼容,因为它们不支持所需的重定位类型。

    • 可能的解决办法**:

1.编译所有ffmpeg文件,不进行汇编程序优化(对于ffmpeg,这是配置选项:- -禁用-asm)
1.生成动态库(例如www.example.com)并在最终库中动态链接它们 libavcodec.so ) and link them in your final library dynamically
我选择了1),它解决了问题。
参考:https://tecnocode.co.uk/2014/10/01/dynamic-relocs-runtime-overflows-and-fpic/

tv6aics1

tv6aics15#

如果您正在构建一个共享库,但需要使用static libavcodec添加链接器标志:

-Wl,-Bsymbolic

在cmake的情况下:

set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-Bsymbolic")
mefy6pfw

mefy6pfw6#

我尝试在Centos 7上安装Dashcast时遇到了同样的问题。修复方法是在x264 Makefile中的每个CFLAGS的末尾添加-fPIC。然后我必须为x264和ffmpeg运行make distclean并重建。

zpgglvta

zpgglvta7#

除了这里的好答案,特别是罗伯特·卢乔的。
我想说的是,在我的例子中,我一直在有意地尝试静态编译ffmpeg的一个版本,所有必需的依赖项和其他必需的东西,我都是静态编译的。
当我为ffmpeg进程运行./configure时,我没有注意到命令行上有--enable-shared。只有删除它并运行./configure,我才能够正确编译(一个ffmpeg二进制文件的所有56mbs)。如果您的意图是静态编译,也可以检查一下

olqngx59

olqngx598#

我正在用gcc4.8.5在CentOS7上构建ffmpeg 5.1.2。
如**${ffmpegRoot}/doc/platform.texi**中所述:
1)配置选项

"--启用图片”

2)将以下选项添加到项目LDFLAGS中

"-Wl,-B符号”

jyztefdp

jyztefdp9#

在编译之前,请确保“rules.mk“文件已正确包含在Makefile中,或通过以下方式显式包含该文件:
“来源rules.mk“

相关问题