2013-01-02 30 views
3

我尝试在我的应用程序中添加gsoap。 我为i386构建了gsoap。 创建的C代码下的命令:链接c中mac中的错误gsoap

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中添加了库=>构建阶段=>将库链接到二进制文件。 但我得到错误....

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) 

,现在我不知道......我 使用gSOAP的窗口和我把它添加到我的项目5分钟。但我浪费了很多时间在Mac OS中添加它。 你能帮我吗?

+0

我没写。它是由gsoap生成的。我删除它。但现在我有另一个错误 –

+1

如果这是生成的,那么你不应该删除它。你确定你应该链接**所有**这些库?我在工作中使用gsoap(所以我知道它是多么糟糕),我敢肯定,我们不与所有这些库链接... – trojanfoe

+0

我有gsoap类似的问题。我试图编译使用gcc,但得到链接器错误“架构x86_64的未定义符号:”我使用的命令:gcc -o tdc_send_sms tdc_send_sms.c -L/usr/local/lib/-lgsoap –

回答

2

我解决了我的问题! 我不得不用./configure和keys --disable-namespaces。 谢谢。 但是我偷了不明白文件soapClientLib.c的意思。

+0

然后接受您自己的答案。 – Stas

0

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

GCC:

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编译,与添加的gcc的选项-lstdC++:

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

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

这里是this谈话(another link)报价:

的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标头和 错误的共享序列化程序。