Я пытаюсь скомпилировать этот исходный код из make-файла на VPS, но он не работает. VPS - это ОС 64 Cent
Вот полная ошибка
# 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
Вот мой make-файл:
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
Кто-нибудь знает, что случилось?
recompile with -fPIC
?COMPILE_FLAGS=-c -O3 -w -DLINUX -fPIC -I../SDK/amx/
Ответы:
Делайте то, что вам говорит компилятор, т.е. перекомпилируйте с
-fPIC
. Чтобы узнать, что делает этот флаг и зачем он вам нужен в этом случае, см. Параметры генерации кода в руководстве GCC.Вкратце, термин независимый от позиции код (PIC) относится к сгенерированному машинному коду, который не зависит от адреса памяти, т.е. не делает никаких предположений о том, где он был загружен в RAM. В общие объекты (SO) должен быть включен только независимый от позиции код, поскольку они должны иметь возможность динамически изменять свое местоположение в ОЗУ.
Наконец, вы также можете прочитать об этом в Википедии .
источник
-fPIC
ко всем вызовам компилятора для всех исходных файлов (единиц перевода, например,*.cpp
файлов) библиотеки. Конкретный способ сделать это зависит от используемой вами системы сборки. Например, в CMake вы можете выпуститьset_target_properties(${LIBRARY_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
. В случае с этим парнем (использующим старый добрый Make), ему придется это сделать,COMPILE_FLAGS+=-fPIC
поскольку он использует эту переменную для обозначения набора флагов компиляции для всех исходных файлов своей библиотеки.В моем случае эта ошибка возникла из-за того, что
make
команда ожидала получить разделяемые библиотеки (*.so
файлы) из удаленного каталога, указанногоLDFLAGS
переменной среды. По ошибке там были доступны только статические библиотеки (*.la
или*.a
файлы).Следовательно, моя проблема связана не с программой, которую я компилировал, а с удаленными библиотеками, которые она пыталась получить. Таким образом, мне не нужно было добавлять какой-либо флаг (скажем,
-fPIC
) к компиляции, прерванной из-за ошибки перемещения. Скорее, я перекомпилировал удаленную библиотеку, чтобы общие объекты были доступны.По сути, это была замаскированная ошибка «файл не найден».
В моем случае мне пришлось удалить неуместный
--disable-shared
переключатель приconfigure
вызове необходимой программы, поскольку как общие, так и статические библиотеки были созданы по умолчанию.Я заметил, что большинство программ создают библиотеки обоих типов одновременно, поэтому моя, вероятно, является крайним случаем. В общем, может случиться так, что вам придется включать общие библиотеки, в зависимости от значений по умолчанию.
Чтобы изучить вашу конкретную ситуацию с переключателями компиляции и значениями по умолчанию, я бы зачитал сводку, которая отображается
./configure --help | less
, как правило, в разделе Дополнительные функции. Я часто обнаруживал, что это чтение более надежно, чем руководства по установке, которые не обновляются по мере развития программ зависимостей.источник
Дело не всегда в флагах компиляции, у меня такая же ошибка на gentoo при использовании distcc.
Причина в том, что на сервере distcc используется не усиленный профиль, а на клиенте профиль усилен. Проверьте это обсуждение: https://forums.gentoo.org/viewtopic-p-7463994.html
источник
Исправлено с
-no-pie
опцией на этапе компоновщика:g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...
источник
Простая очистка проекта решила эту проблему для меня.
Мой проект - это приложение на C ++ (не разделяемая библиотека). Я случайно получал эту ошибку после множества успешных сборок.
источник
У меня такая же проблема. Попробуйте перекомпилировать с помощью
-fPIC
флага.источник
Я получаю то же решение, что и комментарий @ camino к ответу https://stackoverflow.com/a/19365454/10593190 и XavierStuvw .
Я заставил его работать (для установки ffmpeg), просто переустановив все с самого начала,
$ ./configure
заменив все экземпляры на$ ./configure --enable-shared
(сначала обязательно удалите все папки и файлы, включая файлы .so из предыдущей попытки).По-видимому, это работает, потому что https://stackoverflow.com/a/13812368/10593190 .
источник