「ServiceContent」オブジェクトのフィールドを単純に取得するために、VMware の Webアプリケーション APIを使用しています。これを実現する方法の例がvmware フォーラムにあります。そこに含まれる例は問題なくコンパイルされますが、単純な例を実行するとセグメンテーション違反が発生します。具体的には、トレースは soap_serializeheader() 関数に戻ります (これらは stdsoap2.cpp で定義されていると思います)。私の問題は、この segfault を回避する方法がわからず、なぜこれが発生しているのかわからないことです (ほぼ一語一句例に従っているため). OS X ツール チェーン (gcc バージョン 4.0.1 (Apple Inc. ビルド 5465)) と (gsoap リリース 2.7.16) を組み合わせて使用しています。gsoap 2.8 を試しましたが、同じ結果が得られました。以下は、私が今いる場所にたどり着くまでに使用した手順です。
これらは、wsdl を解析するために使用したコマンドです。
wsdl2h -o vim25.h vimService.wsdl
これが解析されたら、次のコマンドを使用してコンパイルしました。
soapcpp2 -x -C -pvsp vim25.h -I/place/where/stlvector.h/is
これにより、ファイル vspC.cpp、vspClient.cpp、および vspVimBindingProxy.cpp が生成されます。内部的には、これらのファイルは関数に対して同じプレフィックス (ns1/ns2 など) を持っているため、私の呼び出しは例のものと同じです。
これは、vspC.cpp と vspClient.cpp をコンパイルするために使用しているコマンドです。
g++ -DWITH_COOKIES -DWITH_OPENSSL -c vspC.cpp
g++ -DWITH_COOKIES -DWITH_OPENSSL -c vspClient.cpp
これは、stdsoap2.cpp をコンパイルするために使用するコマンドです (-DWITH_NONAMESPACES を使用してコンパイルしない場合、すべてをリンクすると、未定義のシンボル "_namepspaces" に関するエラーが発生します)。
g++ -DWITH_COOKIES -DWITH_OPENSSL -DWITH_NONAMESPACES -c stdsoap2.cpp
次に、すべてをテスト コードと一緒にリンクします (ここでも、作成したファイルを正しく参照するように変更しただけで、例からほぼ同じようにコピーされます)。
g++ -DWITH_COOKIES -DWITH_OPENSSL vspC.o vcpClient.o stdsoap2.o testcase.cpp -lssl -lcrypto -o doesntwork
これは正しくコンパイルされますが、もちろん実行に失敗します。このvmware フォーラムの投稿で、同じく問題を抱えていた OS X ユーザーについて読みました。gsoapガイドには、stdsoap2.cpp のヘッダーとエラーのシリアル化コードは使用できないため、個別にコンパイルする必要があると書かれているようです。OS Xの投稿のユーザーはこれを行ったようですが、それらをテストファイルに組み込む方法がわかりません(彼は空のenv.hファイルを作成し、soap2cppでコンパイルします)-envH.hを含める場合ファイル vspH.h との名前の競合について取得します。したがって、2 番目の質問は、soap2cpp を使用してすべてのスタブを正しくコンパイルし、名前空間の競合が発生しないようにする方法です(これが発生しているように見えます)。
ユーザー stumpr による最初のvwmare フォーラム リンクに表示されるため、ソースは提供しません。問題がソースにあるとは思いませんが、g++ でのコンパイル中に wsdl2h、soap2cpp、またはフラグの不適切な組み合わせを使用した方法に問題があります。
ご覧いただきありがとうございます。誰かが問題を解決できることを願っています。
編集私はこれを解決したかもしれないと思います-64ビットシステム(およびより多くのメモリを備えたシステム)を使用することにより。X.6 で -m32 を指定してコンパイルしようとしましたが、実行できませんでした (メモリの問題について不平を言っています)。
うまくいけば、誰かがこれに出くわし、答えを知って喜んでくれるでしょう.