编译失败并显示“在制作共享对象时无法使用针对 \`.rodata.str1.8' 的重定位 R_X86_64_32”

新手上路,请多包涵

我正在尝试从 VPS 中的 makefile 编译此源代码,但它不起作用。 VPS 是 64 美分操作系统

这是完整的错误

# make
gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c
g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp
g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp
g++ -O2 -fshort-wchar -shared -o "TCP_V1.so" *.o
/usr/bin/ld: TCP-LINUX_V1.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be     used when making a shared object; recompile with -fPIC
TCP-LINUX_V1.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [all] Error 1

这是我的生成文件:

 GPP=g++
GCC=gcc
OUTFILE="TCP_V1.so"

COMPILE_FLAGS=-c -O3 -w -DLINUX -I../SDK/amx/

all:
    $(GCC) $(COMPILE_FLAGS) ../SDK/amx/*.c
    $(GPP) $(COMPILE_FLAGS) ../SDK/*.cpp
    $(GPP) $(COMPILE_FLAGS) *.cpp
    $(GPP) -O2 -fshort-wchar -shared -o $(OUTFILE) *.o

有谁知道怎么了?

原文由 user1667191 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 635
2 个回答

执行编译器告诉您的操作,即使用 -fPIC 重新编译。要了解此标志的作用以及在这种情况下为什么需要它,请参阅 GCC 手册的 代码生成选项

简而言之,术语 位置无关代码(PIC) 是指生成的与内存地址无关的机器代码,即不对其加载到 RAM 的位置做出任何假设。只有与位置无关的代码应该包含在共享对象 (SO) 中,因为它们应该能够动态更改它们在 RAM 中的位置。

最后,您也可以在 Wikipedia 上阅读它。

原文由 Alexander Shukaev 发布,翻译遵循 CC BY-SA 3.0 许可协议

我们遇到了同样的问题。事实证明这是Makefile中的混淆。当链接器为 gcc ,但 C++ 编译器 clang++ 时发生错误。将链接器更改为 clang++ 修复了它。

原文由 Ralf 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题