3

我尝试在我的应用程序中添加 gsoap。我为 i386 构建了 gsoap。使用以下命令创建 c 代码:

wsdl2h -c -s -o soap.h soap.wsdl 
soapcpp2 -c -C soap.h

我有文件。在此之后,我尝试将这些包含到我的应用程序中。我在 xCode 中添加到我的项目中。我还添加了 6 个库(libgsoap.a、libgsoap++.a、libgsoapck.a、libgsoapck++.a、libgsoapssl.a、libgsoapssl++.a)。我在 Target => Build Phases => Link binary with libraries 中添加了库。但我得到了错误....

ld: duplicate symbol .....

我认为它发生在文件 soapClientLib.c 中是因为:

#ifndef WITH_NOGLOBAL
#define WITH_NOGLOBAL
#endif
#define SOAP_FMAC3 static
#include "soapC.c"
#include "soapClient.c"

对这些的评论是:

Use this file in your project build instead of the two files soapC.c and soapClient.c. This hides the serializer functions and avoids linking problems when linking multiple clients and servers

我删除了它的内容。但在此之后我得到下一个错误......

Undefined symbols for architecture i386:
  "_namespaces", referenced from:
      _soap_init_LIBRARY_VERSION_REQUIRED_20812 in libgsoap.a(libgsoap_a-stdsoap2.o)
     (maybe you meant: _soap_set_namespaces, _soap_set_local_namespaces )
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

现在我不知道......我在 Windows 中使用了 gsoap,并将它添加到我的项目中 5 分钟。但是我浪费了很多时间在mac os中添加它。你能帮助我吗?

4

3 回答 3

2

我解决了我的问题!我必须使用键--disable-namespaces 进行./configure。谢谢你。但是我偷不明白soapClientLib.c文件的意义。

于 2013-01-02T08:26:27.520 回答
0

这个问题可以通过将编译器文件名从 gcc 更改为 g++ 来解决。

海合会:

gcc calcmain.cpp soapC.cpp soapcalcProxy.cpp  -I/opt/local/include -lgsoap++ -L/opt/local/lib
...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

G++:

g++ calcmain.cpp soapC.cpp soapcalcProxy.cpp  -I/opt/local/include -lgsoap++ -L/opt/local/lib
All OK

然而,您可以通过添加 gcc 选项 -lstdc++ 使其在 gcc 下可编译:

gcc calcmain.cpp soapC.cpp soapcalcProxy.cpp  -I/opt/local/include -lgsoap++ -L/opt/local/lib -lstdc++
All OK
于 2014-05-12T23:44:52.733 回答
0

我知道,这是一个老问题,但我花了整整一个晚上才弄清楚这一点。

这是此对话的引述(另一个链接):

soapcpp2 生成的xyz.nsmap文件应该#include在你的代码中。它包含一个全局 XML 名称空间映射(或绑定)表。

单独包含这个的原因是存在命名空间映射表是自定义或共享的场景。

例如,我使用了一个 C++ 类,使用soapcpp2 -i <my_header.h>. 生成的文件之一是<my_service_name>Service.cpp. 为了摆脱_namespaces我不得不解决的问题#include "<my_service_name>.nsmap"

至于soapClientLib.c,我想再次引用那段对话:

请不要在您的构建中使用soapClientLib.c,除非您想组合多个单独生成的客户端/服务器代码。这意味着soapClientLib.c 不包含SOAP 标头和错误的共享序列化程序。

于 2014-06-07T18:06:33.617 回答