2013-01-02 47 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標頭和 錯誤的共享序列化程序。