経緯
gsoap を利用した C++ アプリを、デバッグ機能を有効にしてビルドした際、いくつかの関数でリンクエラーが発生し、aptでインストールできるgsoap系の全ライブラリ(といっても5個ぐらいのはず)をリンクオプションに設定してみたが解決できなかったので、チュートリアルに立ち戻ってみました。
gsoap チュートリアル関連サイト
実行環境
- Ubuntu Linux 1804 LTS (WSL2)
- Ubuntu Linux 2004 LTS (WSL2)
- Debian Linux 10(WSL2)
準備
必用そうなパッケージのインストール
$ sudo apt install build-essential unzip \
libssl-dev zlib1g-dev bison++ flex flexc++
gsoap のビルド
-
gSOAP Toolkit download | SourceForge.net からソースアーカイブを取得する。
$ wget https://jaist.dl.sourceforge.net/project/gsoap2/gsoap-2.8/gsoap_2.8.111.zip
-
gsoapをビルドする。
$ unzip gsoap_2.8.111.zip $ cd gsoap-2.8 $ ./configure $ make $ make install
そして、Ubuntu Linux 1804では失敗します。。。
原因は 追いたくない 不明ですが、Debian10、Ubuntu Linux 2004 だと問題ないので、gsoapのバージョンをさかのぼっていけば、Ubuntu Linux 1804でもビルド成功にたどり着けるかもです。
ここは、今回の本題ではないので、気にせずスルーです。
gsoap ツールを個別ビルドする
ビルドしたバイナリは gsoap-2.8/gsoap/bin
に格納されます。
-
soapcpp2 のビルド
$ cd gsoap-2.8/gsoap/src $ make -f MakefileManual soapcpp2
-
wsdl のビルド
$ cd gsoap-2.8/gsoap/wsdl $ make -f MakefileManual secure
SSLを使わない場合は「secure」を除外します。
チュートリアルの実行
-
チュートリアルサンプル
calc.h
の生成$ mkdir $HOME/tutorial $ cd $HOME/tutorial $ $HOME/gsoap-2.8/gsoap/bin/wsdl2h -o calc.h http://www.genivia.com/calc.wsdl
ls
を実行すると、カレントディレクトリにcalc.h
が生成されます。 -
calc.h
を元にソースファイルを生成$ $HOME/gsoap-2.8/gsoap/bin/soapcpp2 -j -CL -I$HOME/gsoap-2.8/gsoap/import calc.h
ls
を実行すると、カレントディレクトリにいろいろなファイルが生成されます。 -
calcclient.cpp
の作成ツールで生成したファイルには
main
関数が無いので、main
関数を準備します。calcclient.cpp#include "calc.nsmap" #include "soapcalcProxy.h" int main() { calcProxy calc; double sum; if (calc.add(1.23, 4.56, sum) == SOAP_OK) std::cout << "Sum = " << sum << std::endl; else calc.soap_stream_fault(std::cerr); calc.destroy(); // same as: soap_destroy(calc.soap); soap_end(calc.soap); }
-
stdsoap2.h のコピー
stdsoap2.cpp
の#include "stdsoap2.h"
の関係で、カレントディレクトリにstdsoap2.h
をコピーしておきます。
ビルドする時に-I
でインクルードパスを指定する派の人は、この作業は不要です。$ cp $HOME/gsoap-2.8/gsoap/stdsoap2.h ./
-
calcclient のビルド
$ c++ -o calcclient calcclient.cpp soapC.cpp soapcalcProxy.cpp \ $HOME/gsoap-2.8/gsoap/stdsoap2.cpp
4 を省略した場合は、
$ c++ -o calcclient \ -I$HOME/gsoap-2.8/gsoap/ \ calcclient.cpp soapC.cpp soapcalcProxy.cpp $HOME/gsoap-2.8/gsoap/stdsoap2.cpp
-
calcclient の実行
$ ./calcclient Sum = 5.79
で、ここからが本題です。
gsoap のデバッグ機能を有効にする
gsoapには、アプリビルド時にデバッグオプションを付けると、アプリが送受信するsoapメッセージログをファイルに出力してくれる機能があります(User guide - Debugging)。
やり方は、下記のように、コンパイルオプションに -DDEBUG
を付けるだけです。
$ c++ -o calcclient \
-DDEBUG \
-I$HOME/gsoap-2.8/gsoap/ \
calcclient.cpp soapC.cpp soapcalcProxy.cpp $HOME/gsoap-2.8/gsoap/stdsoap2.cpp
デバッグオプションを有効にすると、アプリが送受信する soap メッセージが RECV.log/SENT.log に出力されます。また、送受信内部処理ログっぽいものが TEST.log に出力されます。ここまでたどり着くのに丸一日かかった。。。
アプリの挙動がログファイルで確認できるメリットはありますが、常にファイルアクセスが発生するので性能が低下するのと、長時間運用するとディスク容量が圧迫されるので注意が必要です。
参考サイト
-
LINUX WEBSERVICE GSOAPチュートリアル(1)
海外サイトの日本語機械翻訳サイト?な感じで、ところどころ単語が欠落していました。