0

Now I am writing a program to call a web service. I write testMain.c. The others are generated by wsdl2h and soapcpp2.

My compiling command is like this:

 gcc -Wall -g -c -L. soapC.c soapClient.c stdsoap2.c testMain.c
 gcc -o testMain -L/usr/lib -lgsoap -lgsoapck -lgsoapssl soapC.o soapClient.o stdsoap2.o testMain.o 

And I get these errors. Please help me.

stdsoap2.o: In function `soap_print_fault':
/test/stdsoap2.c:16279: undefined reference to `soap_check_faultsubcode'
/test/stdsoap2.c:16281: undefined reference to `soap_check_faultdetail'
stdsoap2.o: In function `soap_sprint_fault':
/test/stdsoap2.c:16341: undefined reference to `soap_check_faultdetail'
collect2: ld returned 1 exit status
4

4 回答 4

1

最新版本的 GCC/ld/GNU 工具链要求以特定顺序指定对象和库文件,以便链接器可以按照它们相互依赖的相同顺序找到符号。这意味着库应该放在命令行的末尾;你的第二行(当你链接时)应该是

gcc -o testMain -L/usr/lib soapC.o soapClient.o stdsoap2.o testMain.o -lgsoap -lgsoapck -lgsoapssl

反而。

于 2012-12-31T07:14:53.870 回答
0

我在网上搜索,发现一篇与我的问题非常相似的帖子。我使用这个解决方案并解决了这个问题。http://www.mail-archive.com/gsoap@yahoogroups.com/msg01022.html

于 2013-01-01T01:29:07.150 回答
0

您不需要链接stdsoap2.o到您的项目,因为它已经包含在libgsoap(通过 gcc 链接器选项给出-lgsoap)。尝试stdsoap2.c从您的项目中排除。来自gSOAP 常见问题解答

我收到 gcc/g++ (GNU GCC) 的链接错误。我应该怎么办?对于 C 应用程序:使用 soapcpp2 选项 -c 生成 C 代码,仅使用包的 .c 文件,与 libgsoap.a (-lgsoap) 链接或使用lib 的源代码 stdsoap2.c(和适用时的 dom.c)。

于 2013-01-04T20:54:33.047 回答
0

我从源代码编译的 gsoap-2.8.16 遇到了同样的问题。(那个版本是 CentOS 6 附带的。)

首先,我检查了一个丢失的库。根据nmgsoap-2.8.16 提供的所有静态库中使用的:

for X in /usr/local/lib/libgsoap*.a ; do echo $X; nm $X | grep soap_check_faultdetail; done`

事实证明,没有一个库提供缺少的符号。

简要查看源代码可以发现,这两个方法的预期返回类型soap_check_faultdetailsoap_check_faultsubcodeconst char*,并且这些用于生成错误消息。

在我看来,这些似乎是客户端必须提供的回调。也许他们的实现依赖于 WSDL,并且将由 gsoap 代码生成实用程序提供 - 我不知道,请参阅上面或下面的@ChristianAmmer 的答案。

无论如何,因为我知道没有提供符号,并且这里可能可以接受以 null 结尾的字符串,所以我只提供了我自己的无操作实现:

// gsoap-missing-symbols.cpp
extern "C" {
const char* soap_check_faultdetail() { return 0; }
const char* soap_check_faultsubcode() { return 0; }
}

这是一个蛮力解决方案。如果您遵循此解决方案,您可能应该在将来检查链接器警告;也许某些机制(例如来自 gsoap 代码生成器)会在开发后期提供冲突的实现。

对于更高版本的 gsoap,我相信这些符号不再使用并且可以删除(或重命名),soap_check_faultX参见https://www.genivia.com/changelog.html

于 2022-01-27T14:26:00.910 回答