Я недавно обновил 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 с этими функциями, установленными на статические.