创建共享对象时,不能使用针对未定义符号的重定位 R_X86_64_PC32;使用 -fPIC 重新编译

2024-02-18

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


你需要获得提供的图书馆soap_serializeheader为共享库编译做好准备,它不是ebaySoaLibClientLib.cpp. Use g++ -v看看有哪些库g++正在使用。尝试使用共享库而不是静态库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建共享对象时,不能使用针对未定义符号的重定位 R_X86_64_PC32;使用 -fPIC 重新编译 的相关文章

随机推荐