Перемещение R_X86_64_PC32 к неопределенному символу не может быть использовано при создании общего объекта;перекомпилировать с -fPIC - PullRequest
0 голосов
/ 01 февраля 2019

Я недавно обновил gSOAP с 2.8.7 до 2.8.76.Мне пришлось внести несколько незначительных корректировок кода для обновления, но после обновления код не будет связываться на компьютере, как раньше.

Я пытаюсь использовать gSOAP для создания общей библиотеки на компьютере.компьютер, который использует g ++ 4.9.2.Я сжал код, чтобы создать тестовый пример, который немного упрощает попытки определить, где происходит сбой.

gSOAP генерирует некоторые файлы ebaySoapLib * при запуске:

/usr/local/bin/soapcpp2 -z1 -C -w -x -n -pebaySoapLib -qebaySoapLib -I/usr/local/include/gsoap:/usr/local/share/gsoap:/usr/local/share/gsoap/import ebaySvc.h

Опция -z1 позволяет сохранить все как у gSOAP 2.8.7.

Если я запустил:

g++  -fPIC -c ebaySoapLibClientLib.cpp
g++  -shared -fPIC -o test.so ebaySoapLibClientLib.o

Я получу ошибку:

/usr/bin/ld: ebaySoapLibClientLib.o: relocation R_X86_64_PC32 against
undefined symbol `soap_serializeheader' can not be used when making a
shared object; recompile with -fPIC

/usr/bin/ld: final link failed: Bad value

collect2: error: ld returned 1 exit status

Я скопировал точные файлы на другой компьютер с g ++ 6.3.0 (не уверен, что версия компилятора имеет значение или сейчас), и это прекрасно компилируется и связывается.

Файл ebaySoapLibClientLib.cpp содержит:

#define SOAP_FMAC3 static
#include "ebaySoapLibC.cpp"
#include "ebaySoapLibClient.cpp"

Теперь, если я уберу строку:

#define SOAP_FMAC3 static

, тогда код прекрасно скомпилируется на обоих компьютерах.

Я в растерянностидля того, что мне нужно сделать по-другому, чтобы сделать это нормально с компьютером g ++ 4.9.2.Я мог бы убрать #define, чтобы функции не были определены как статические, и заставить его работать, но вопрос в том, WHY , поскольку gSOAP по какой-то причине вводит его туда, и он прекрасно связывается с g ++6.3.0 с этими функциями, установленными на статические.

1 Ответ

0 голосов
/ 01 февраля 2019

Вам нужно получить библиотеку, которая поставляет soap_serializeheader для компиляции, готовой для разделяемой библиотеки, а не ebaySoaLibClientLib.cpp.Используйте g++ -v, чтобы увидеть, какие библиотеки g++ использует.Попробуйте использовать разделяемую библиотеку вместо статической.

...