我正在尝试从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
这是我的makefile:
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
有人知道怎么了吗?
执行编译器告诉您的操作,即使用进行重新编译-fPIC。要了解此标志的作用以及在这种情况下为什么需要此标志,请参阅GCC手册的 代码生成选项 。
-fPIC
简而言之,术语“ 位置无关代码” (PIC)指的是与内存地址无关的生成的机器代码,即,不对将其加载到RAM中的位置进行任何假设。共享对象(SO)应该仅包含位置无关代码,因为它们应具有动态更改其在RAM中位置的能力。
最后,您也可以在 Wikipedia 上阅读有关它的信息。