我正在尝试构建一个静态链接到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
答案 0 :(得分:0)
如果您正在构建共享库但需要与静态 ffmpeg 库链接,请添加链接器标志:
-Wl,-Bsymbolic
使用 cmake 时:
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-Bsymbolic")