회사 프로젝트로 wsdl 파일을 이용한 웹 서비스 프로그램을 제작해야 할 일이 있었다.
물론 사용 언어는 C.
먼저 wsdl 파일들에서 header 파일을 추출해야 했다.
이를 위해서 사용한 프로그램은 wsdl2h
총 3개의 wsdl 파일에서 header 파일을 추출해야 했다.
다음의 명령어를 사용했다.
$ wsdl2h -c -o SoapEnv.h SendSms.wsdl
$ wsdl2h -c -n SendSms -o SendSms.h SendSms.wsdl
$ wsdl2h -c -n ReceiveSms -o ReceiveSms.h ReceiveSms.wsdl
$ wsdl2h -c -n SmsNotificationManagerService -o SmsNotificationManagerService.h SmsNotificationManagerService.wsdl
위의 명령어를 잘 보면 추출해야 하는 wsdl 파일은 3개인데, 사용한 명령어는 총 4개이다.
정확히는 SendSms.wsdl 파일에서 두개의 header 파일을 추출했다.
그 이유는 실제 컴파일과 라이브러리 구현에 사용할 gsoap를 위해서 기본 header 파일이 필요했기 때문이다.
그리고, 위에 나타낸 옵션 중, −c 옵션은 c 언어를 위한 헤더 파일 생성 옵션, −n 옵션은 namespace 영역을 구분짓기 위해 사용한 옵션이다.
하나 이상의 wsdl 파일을 사용한 라이브러리 제작시, −n 옵션이 특히 중요한데, 이유는 −n 옵션 없이 wsdl2h 를 사용할 경우, 여러개의 wsdl 사용시 서로 혼합된 namespace 영역을 사용하기 때문이다.
이는 나중에 wsdl 파일을 추가 하게 될 경우, 프로그램 코드상에서 호출되는 메소드 이름이 변경이 되는 등 여러모로 곤란이 생긴다. 때문에 반드시 필요한 옵션이다.
ref: http://www.cs.fsu.edu/~engelen/soapdoc2.html#tth_sEc8
wsdl2h 를 사용하면 각각의 헤더 파일들이 만들어 진다. 이렇게 만들어진 헤더파일들을 이용해 실제 C 에서 사용 가능한 코드로 만들어줘야 한다.이를 해주는 프로그램이 soapcpp2 이다. 이번 프로젝트에서 다음의 명령어/옵션을 사용했다.
$ soapcpp2 -C -c SoapEnv.h
$ soapcpp2 -C -c -n -pSendSms SendSms.h
$ soapcpp2 -C -c -n -pReceiveSms ReceiveSms.h
$ soapcpp2 -C -c -n -pSmsNotificationManagerService SmsNotificationManagerService.h
나는 이 명령어를 makefile 안에 넣어 두었다. 그리고 매번 컴파일을 실행할 때마다 위의 명령어가 자동으로 시작되도록 구성했다.
왜냐하면 soapcpp2 프로그램의 버전때문이었다.
soapcpp2 프로그램으로 생성되는 파일들은 바로 C 로 컴파일이 가능한 *.c 파일과 *.h 파일들이다.이를 이용해서 라이브러리를 생성하고, 링크시켜서 사용하기 위해서는 libgsoap.a 파일과 같은 gsoap 라이브러리가 추가로 필요하다.
그런데, 만약 매번 soapcpp2 프로그램을 통해서 *.c 와 *.h 파일을 생성하지 않는다면, 이미 생성되어있는 파일들을 이용해서 라이브러리를 만들고 gsoap 라이브러리와 링크를 할텐데..
이 때, *.c/*.h 파일을 생성한 soapcpp2 의 버전과 링크되는 libgsoap.a 파일의 버전이 서로 맞지 않는다면 링크가 안되는 문제가 발생한다.
이런 이유로 매번 컴파일을 진행할 때마다 위의 명령어를 통해서 새로이 stub 코드를 작성하도록 구성했다.
그리고, wsdl2h 사용할 때와 마찬가지로, namespace 영역 구분을 위해 −n 옵션과 −p 옵션을 추가했다. 그리고, gcc 컴파일을 진행시 −D 옵션을 이용해 Define 을 별도로 걸어주었다.
이는 지정된 namespace 영역을 사용하기 위해 필요한 조치이다.
makefile 안에 다음과 같은 Define 을 넣어주었다.ref: http://www.cs.fsu.edu/~engelen/soapdoc2.html#tth_sEc19.36
DEFS = -DWITH_OPENSSL -DWITH_NONAMESPACES
마지막으로, 왜 그런지는 모르겠는데.. 이상하게 gsoap 라이브러리를 추가시, 자꾸 세그먼트 폴트가 났다.
계속 방법을 찾다가 제일 마지막에 gsoap 라이브러리를 추가 해야 오류가 나지않는 이상한 현상을 확인했다.
왜그러는지는 모르겠으나.. 다른 해결할 방법을 찾지 못했다.
LIBS = -lzmq -lczmq -luuid -ljansson -lssl -lcrypto -lpthread -lcurl -lgsoapssl -lgsoap