Компиляция завершается с ошибкой " перемещение R X86 64 32 против `.rodata.str1. 8 ' не может быть использован при создании общего объекта"
Я пытаюсь скомпилировать этот исходный код из файла 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
кто-нибудь знает что случилось?
5 ответов:
делать то, что компилятор говорит вам делать, т. е. перекомпилировать с
-fPIC
. Чтобы узнать, что делает этот флаг и зачем он вам нужен в этом случае, см. Параметры Генерации Кода руководства GCC.короче говоря, термин позиционно-независимый код (PIC) относится к сгенерированному машинному коду, который является агностическим адресом памяти, т. е. не делает никаких предположений о том, где он был загружен в ОЗУ. Только позиционно-независимый код должен быть включены в общие объекты (SO), так как они должны иметь возможность динамически изменять свое местоположение в ОЗУ.
наконец, вы можете прочитать об этом на Википедия тоже.
в моем случае эта ошибка произошла, потому что
make
команда ожидала получить общие библиотеки (*.so
файлы) из удаленного каталога обозначаетсяLDFLAGS
переменные среды. По ошибке там были доступны только статические библиотеки (*.la
или*.a
файлы).следовательно, моя проблема заключалась не в программе, которую я компилировал, а в удаленных библиотеках, которые он пытался извлечь. Итак, мне не нужно было добавлять какой-либо флаг (скажем,
-fPIC
) для составления прервано из-за ошибки перемещения. Вместо этого я перекомпилировал удаленную библиотеку так, чтобы общие объекты были доступны.в основном, это была замаскированная ошибка "файл не найден".
в моем случае мне пришлось удалить неправильно
--disable-shared
переключательconfigure
ссылка для необходимых программ, так как общие и статические библиотеки были построены по умолчанию.
я заметил, что большинство программ строят оба типа библиотек в же время, так что у меня, наверное, случай. В общем, это может быть так, что вы скорее должны включить общие библиотеки, в зависимости от значений по умолчанию.
чтобы проверить вашу конкретную ситуацию с компиляцией коммутаторов и значений по умолчанию, я бы зачитал резюме, которое появляется с
./configure --help | less
, как правило, в разделе дополнительных функций. Я часто обнаруживал, что это чтение более надежно, чем руководства по установке, которые не обновляются во время развития программ зависимостей.
Это не всегда о флагах компиляции, у меня есть такая же ошибка на gentoo при использовании distcc.
причина в том, что на сервере distcc используется незатвердевший профиль, а на клиенте профиль затвердевает. Проверьте это обсуждение: https://forums.gentoo.org/viewtopic-p-7463994.html