relocation R_X86_64_32 against `.rodata‘ can not be used when making a shared object; recompile with
Posted 很黑的黑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了relocation R_X86_64_32 against `.rodata‘ can not be used when making a shared object; recompile with相关的知识,希望对你有一定的参考价值。
使用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选项,这样就不会报错误了
eclipse编译动态链接库文件报错 relocation R_X86_64_32 against `.data' can not be used when making a shared o
解决方法:
选中工程右键->属性(properties)->c/c++Build -> GCC C Compiler -> Command ->gcc -fPIC。
问题解决!!
以上是关于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 be used when making a shared object; recompile with
R_X86_64_32S 和 R_X86_64_64 重定位是啥意思?
重定位 R_X86_64_32S 对 `.data' 在制作共享对象时不能使用;使用 gcc 重新编译 -fPIC
为什么在创建特定于x86_64的共享对象时“无法使用R_X86_64_32”的CMake解决方案?
重定位 R_X86_64_PC32 对符号 _ZTISt13runtime_error@@GLIBCXX_3.4 在制作共享对象时不能使用;使用 -fPIC 重新编译