2012-04-19 4 views
3

동일한 응용 프로그램에서 2 개의 별도 wsdl 파일을 사용하여 Linux에서 gSOAP를 사용하는 C++ 웹 서비스 클라이언트를 작성했습니다. 나는 일이 하나 개의 WSDL 파일로 작업하고, 문서를 읽고 얻을 관리 한 두 파일에 wsdl2h를 사용하는 과정을 통해 갔다 :2 개의 다른 wsdl 파일로 gSOAP를 사용할 때 링커 오류가 발생했습니다.

wsdl2h -o header.h wsdlfile1.wsdl wsdlfile2.wsdl 

이 잘 근무하고 그래서 나는 다음

soapcpp2 -i -I/usr/share/gsoap/import/ header.h 
했다

그런 다음 지시 된대로 typemap.dat에서 모든 일반적인 네임 스페이스 수정을 수행했습니다. 이제는 soapService1Proxy.cpp/h 및 soapService2Proxy.cpp/h 유형의 두 .cpp 및 .h 파일이 있음을 확인했습니다. 이것은 내가 기대했던 것만은 아니지만 관계없이 두 주 헤더를 주 함수에 포함시키고 각 Proxy 클래스의 인스턴스를 만들고 하나의 wsdl 파일로 수행했던 것과 똑같은 방식으로 사용했습니다. 나는 그 오류

/tmp/ccHNDAM4.o:(.data+0x0): multiple definition of `namespaces' 
    /tmp/ccLJIHwV.o:(.data+0x0): first defined here 
    collect2: ld returned 1 exit status 

을 반환

g++ -DWITH_OPENSSL main.cpp soapC.cpp soapService1Proxy.cpp soapService2Proxy.cpp -lgsoapssl++ -lssl 

컴파일 나는 'namepaces이'(이 경우 각 WSDL에 대해 동일)에 .nsmap 파일에 배열을 참조 것을 알고있다. 컴파일러가 다중 정의를 포함하면이 중 하나만 포함했습니다. 가능한 한 충실하게 가이드 라인과 gSOAP 문서를 따르려고했지만이 문제를 해결할 수 없기 때문에 내가 잘못하고있는 것을 누군가가 말할 수 있다면 정말 고맙겠습니다.

답변

2

나는 SOAP을 사용한 적이 없지만 this user guide을 간략하게 살펴 보았습니다.

section 7.1.4의 마지막 단락은 soapcpp2-n-p 옵션이 링크 충돌을 해결하는 데 도움이된다고 말합니다. 거기에 링크가 section 19.35에 대한 자세한 정보를 제공합니다. -q 옵션을 사용하여 각 파일마다 wsdl2h을 별도로 실행해야 각 파일에 C++ 네임 스페이스를 제공해야합니다. soapcpp2을 실행하면 -p이 자동으로 적용되며 -n을 입력하면 namespaces 배열에 C++ 네임 스페이스 이름 접두사와 밑줄이옵니다.

나는 이것들을 시험해 보지 않았지만 잘하면 그 정도면 될 것입니다. 당신은 다시 가야합니다.