我最近将 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 上链接良好,并将这些函数设置为静态。