gcc"对符号`ff_M24A'"重新定位R_X86_64_PC32;在linux

时间:2016-01-21 23:05:25

标签: c linux gcc ffmpeg linker

我正在尝试构建一个静态链接到ffmpeg的JNI共享库。

但是在链接阶段,gcc失败并出现以下错误:

/usr/bin/ld: ./lib_lin64/libswscale.a(swscale.o): relocation R_X86_64_PC32 against symbol `ff_M24A' can not be used when making a shared object; recompile with -fPIC

我使用以下命令编译我的jni库:

gcc -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -I ./include -fPIC -c *.c
gcc -shared -Wl,--no-undefined -o libnv_avc_dec.so *.o -Wl,-Bstatic -L./lib_lin64 -lavcodec -lavutil -lswresample -lswscale -Wl,-Bdynamic -lm

我只使用h264解码功能,所以我也使用最少的必需功能集从源代码构建ffmpeg。我使用的./configure命令是:

./configure \ --enable-pic --prefix=ffmpeg-dist \ --disable-debug --enable-version3 --enable-gpl \ --disable-everything --enable-hwaccel=h264_vdpau --enable-hwaccel=h264_vaapi --enable-hwaccel=h264_qsv --enable-hwaccel=h264_mmal \ --enable-decoder=h264 --enable-decoder=h264_vdpau --enable-decoder=h264_crystalhd --enable-decoder=h264_mmal --enable-decoder=h264_qsv \ --disable-iconv --disable-securetransport --disable-xlib --disable-zlib --disable-lzma --disable-bzlib --disable-doc --disable-programs --disable-avformat --disable-avfilter --disable-postproc

因此,据我所知,链接器告诉我应该使用-fPIC标志编译ffmpeg以创建共享库。但我相信我已经通过指定--enable-pic配置标志来实现这一点。我几乎被困在这里,因为我对autotools不是很熟悉,特别是ffmpeg构建过程也不熟悉。

如果这是ffmpeg .a libs没有使用-fPIC标志编译的问题,我怎么强迫呢?如果不是这样的话,我做错了什么以及如何解决这个错误呢?

环境详细信息:Virtualbox中的64位Ubuntu 14.04.3,gcc 4.8.5和5.3(两者都给出了相同的结果),ffmpeg v.2.8.5

1 个答案:

答案 0 :(得分:0)

如果您正在构建共享库但需要与静态 ffmpeg 库链接,请添加链接器标志:

-Wl,-Bsymbolic

使用 cmake 时:

set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-Bsymbolic")