2013-01-02 1 views
3

내 응용 프로그램에 gsoap을 추가하려고합니다. i386 용 gsoap을 구축했습니다. 아래 명령을 생성 된 C 코드 :mac에서 오류 gsoap을 (를) Mac에서 연결

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 => 라이브러리와 바이너리를 링크합니다. 하지만 내가 그것을했다 파일 soapClientLib.c에 발생할 일이 생각 오류 ....

ld: duplicate symbol ..... 

을 가지고 :

#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 분 내 프로젝트에 추가. 하지만 맥 오에스에 추가하는 데 많은 시간을 낭비했다. 도와 주시겠습니까?

+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

내 문제가 해결되었습니다. 키 --disable-namespaces를 사용하여 ./configure를 수행해야했습니다. 감사합니다. 하지만 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 ++ : 그

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

내가 아는 :

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

당신 ++ -lstdc GCC 옵션을 추가하여, GCC 아래는 컴파일 가능한 만들 수 있습니다 이것은 오래된 질문이지만, 나는 이것을 알아내는 데 전 저녁을 보냈습니다.

soapcpp2 생성 xyz.nsmap 파일이 #include 코드에서 거라고해야한다 : 여기

this 대화 ( another link)에서 인용 한 것입니다. 에는 전역 XML 네임 스페이스 매핑 (또는 바인딩) 테이블이 들어 있습니다.

별도로 포함시키는 이유는 네임 스페이스 매핑 테이블을 사용자 지정하거나 공유하는 시나리오가 있기 때문입니다.

예를 들어 soapcpp2 -i <my_header.h>으로 생성 된 C++ 클래스를 사용했습니다. 생성 된 파일 중 하나는 <my_service_name>Service.cpp입니다. _namespaces 문제를 없애기 위해서는 #include "<my_service_name>.nsmap"이 필요했습니다.

soapClientLib.c에 관해서는, 나는의는 다시 대화를 표기합니다 : 당신이 여러 별도로 생성 된 클라이언트/서버 코드를 결합하려는 경우가 아니면

빌드에 soapClientLib.c을 사용하지 마십시오. 즉, soapClientLib.c에는 SOAP 헤더에 대한 공유 serializer와 오류가 포함되지 않습니다.