5

同じアプリケーションで 2 つの個別の wsdl ファイルを使用して、Linux で gSOAP を使用して C++ Web サービス クライアントを作成しています。私は 1 つの wsdl ファイルだけで動作するように管理し、ドキュメントを読んだ後、両方のファイルで wsdl2h を使用するプロセスを実行しました。

    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 の 2 つの .cpp および .h ファイルがあることがわかりました。これは私が期待したものとはまったく異なりますが、メイン関数に両方のヘッダーを含め、各 Proxy クラスのインスタンスを作成し、1 つの wsdl ファイルで行ったのとまったく同じ方法で使用しました。次に、コンパイルします

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

エラーを返す

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

「namepaces」が .nsmap ファイルの配列を参照していることはわかっています (この場合、各 wsdl で同一です)。両方を含めると、コンパイラが複数の定義を訴えるので、これらのうちの 1 つだけを含めました。ガイドラインと gSOAP のドキュメントにできる限り忠実に従おうとしましたが、この問題を解決することはできません。

4

1 に答える 1

3

SOAP を使用したことはありませんが、このユーザー ガイドをざっと見てみました。

セクション 7.1.4の最後の段落では、-nおよび-pオプションがsoapcpp2リンクの競合を解決するのに役立つと述べています。セクション 19.35へのリンクは、詳細情報を提供します。各ファイルに C++ 名前空間を提供するオプションをwsdl2h使用して、各ファイルを個別に実行する必要があるようです。-qその後、実行するとsoapcpp2自動的に適用され、配列の前に C++ 名前空間名とアンダースコアが続くように指定するだけです。-p-nnamespaces

私はこれを試したことはありませんが、うまくいけば、それがあなたを再び動かすのに十分であることを願っています.

于 2012-04-19T22:53:41.960 に答える