当前位置:   article > 正文

relocation R_X86_64_32 against `.rodata‘ can not be used when making a shared object; recompile with_relocation r_x86_64_32 against `.rodata' can not b

relocation r_x86_64_32 against `.rodata' can not be used when making a share

使用makefile编译时报了下面的错误,看起来是使用的ffmpeg库导致的,这个工程是之前别人写的,不可能git上传不能编译的工程吧,怀疑是自己拷贝过来的库有问题,从其他工程拷贝这个工程需要的库,还是报错,纳尼??

/usr/bin/ld: ./comlib/ffmpeg/lib/libavcodec.a(allcodecs.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
./comlib/ffmpeg/lib/libavcodec.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
Makefile:57: recipe for target 'libDecoderFFMPEGLive.so.1.0.0.7' failed
make: *** [libDecoderFFMPEGLive.so.1.0.0.7] Error 1


再网上找了一圈,说是

1、编译参数要加-fPIC,但实际上makefile已经加了

2、又尝试去掉-lz -ldl等选项(无能狂试),还是不行

3、网上说如果你的makefile很大,CFLAGS也不明确,那就在配置时手动加上,即:

        $CFLAGS="-fPIC" ./configure ..............

如果这样还不行,你需要试一下sudo,即:

       $sudo   CFLAGS="-fPIC" ./configure ..............

一想ffmpeg和boost编译时都没加上这个,报着试一试的心态加了,然后就编译通过了,纳尼?越来越晕了,为什么其他工程的ffmpeg库不需要加这个,越来越晕了,先记录下,等我知道为什么了,再在下面记录原因(挖坑)

填坑:

1、加了-fPIC选项就表明编译生成的.o文件是位置无关的

2、如果编译静态库时没有加-fPIC选项,则静态库中的.o文件是位置有关的

3、当一个动态库中需要包含此静态库时,将静态库中的.o文件包含进动态库,重新链接时就会报错

解决办法:将需要被动态库包含的静态库在编译时加上-fPIC选项,这样就不会报错误了

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
  

闽ICP备14008679号