Компиляция завершается с ошибкой " перемещение R X86 64 32 против `.rodata.str1.8 ' не может использоваться при создании общего объекта"

Я пытаюсь скомпилировать этот исходный код из файла Makefile в VPS, но он не работает. 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 files) из удаленного каталога, указанного LDFLAGS переменные среды. По ошибке там были доступны только статические библиотеки (*.la или *.a файлы).

следовательно, моя проблема заключалась не в программе, которую я компилировал, а в удаленных библиотеках, которые он пытался получить. Итак, мне не нужно было добавлять флаг (скажем,-fPIC) для составления прервано из-за ошибки перемещения. Вместо этого я перекомпилировал удаленную библиотеку, чтобы общие объекты были доступны.

в основном, это была ошибка файла не найден в маскировке.

в моем случае мне пришлось удалить неправильно --disable-shared переключатель configure ссылка для необходимых программ, так как общие и статические библиотеки были построены по умолчанию.


я заметил, что большинство программ создают оба типа библиотек на же время, так что у меня, наверное, случай. В общем случае, возможно, вам придется включить общие библиотеки, в зависимости от значений по умолчанию.

чтобы проверить вашу конкретную ситуацию с коммутаторами компиляции и значениями по умолчанию, я бы зачитал резюме, которое появляется с ./configure --help | less, как правило, в разделе дополнительных функций. Я часто обнаруживал, что это чтение более надежно, чем руководства по установке, которые не обновляются во время разработки программ зависимостей.


Это не всегда о флагах компиляции, у меня такая же ошибка на gentoo при использовании distcc.

причина в том, что на сервере distcc используется незатвердевший профиль, а на клиенте профиль затвердевает. Проверьте это обсуждение: https://forums.gentoo.org/viewtopic-p-7463994.html


"чистый" решил это для меня.

мой проект-это приложение C++ (не общая библиотека), и я получил эту ошибку случайно один раз, когда пытался ее скомпилировать.


У меня была та же проблема. Попробуйте перекомпилировать с помощью -fPIC флаг.