3

アプリケーションにgsoapを追加しようとしています。i386用のgsoapを作成しました。underコマンドでcコードを作成しました:

wsdl2h -c -s -o soap.h soap.wsdl 
soapcpp2 -c -C soap.h

ファイルを取得しました。この後、これらをアプリに含めようとしました。xCodeでプロジェクトに追加しました。また、6つのライブラリ(libgsoap.a、libgsoap ++。a、libgsoapck.a、libgsoapck ++。a、libgsoapssl.a、libgsoapssl ++。a)を追加しました。ターゲット=>ビルドフェーズ=>ライブラリとバイナリをリンクするにライブラリを追加しました。しかし、エラーが発生しました。

ld: duplicate symbol .....

私はそれがファイルsoapClientLib.cで起こった原因だと思った:それは:

#ifndef WITH_NOGLOBAL
#define WITH_NOGLOBAL
#endif
#define SOAP_FMAC3 static
#include "soapC.c"
#include "soapClient.c"

これらに対するコメントは次のとおりです。

Use this file in your project build instead of the two files soapC.c and soapClient.c. This hides the serializer functions and avoids linking problems when linking multiple clients and servers

コンテンツを削除しました。しかし、この後、次のエラーが発生しました...

Undefined symbols for architecture i386:
  "_namespaces", referenced from:
      _soap_init_LIBRARY_VERSION_REQUIRED_20812 in libgsoap.a(libgsoap_a-stdsoap2.o)
     (maybe you meant: _soap_set_namespaces, _soap_set_local_namespaces )
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

そして今、私にはわかりません...私はWindowsでgsoapを使用し、それを5分間プロジェクトに追加しました。しかし、私はそれをmacosに追加するのに多くの時間を無駄にしました。手伝って頂けますか?

4

3 に答える 3

2

問題を解決しました!キー--disable-namespacesを使用して./configureを実行する必要がありました。ありがとうございました。しかし、私はファイルsoapClientLib.cの意味を理解していません。

于 2013-01-02T08:26:27.520 に答える
0

この問題は、コンパイラのファイル名をgccからg++に変更することで解決できます。

GCC:

gcc calcmain.cpp soapC.cpp soapcalcProxy.cpp  -I/opt/local/include -lgsoap++ -L/opt/local/lib
...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

G ++:

g++ calcmain.cpp soapC.cpp soapcalcProxy.cpp  -I/opt/local/include -lgsoap++ -L/opt/local/lib
All OK

それでも、gccオプション-lstdc ++を追加することで、gccでコンパイル可能にすることができます。

gcc calcmain.cpp soapC.cpp soapcalcProxy.cpp  -I/opt/local/include -lgsoap++ -L/opt/local/lib -lstdc++
All OK
于 2014-05-12T23:44:52.733 に答える
0

これは古い質問であることは知っていますが、私はこれを理解するために一晩中過ごしました。

これがこの会話からの引用です(別のリンク):

soapcpp2で生成されたxyz.nsmapファイルを#includeコードに含める必要があります。これには、グローバルXML名前空間マッピング(またはバインディング)テーブルが含まれています。

これを個別に含める理由は、名前空間マッピングテーブルがカスタマイズまたは共有されるシナリオがあるためです。

たとえば、で生成されたC++クラスを使用しましたsoapcpp2 -i <my_header.h>。生成されたファイルの1つはです<my_service_name>Service.cpp。問題を取り除くために私はそれにし_namespacesなければなりませんでし#include "<my_service_name>.nsmap"た。

についてはsoapClientLib.c、その会話をもう一度引用したいと思います。

別々に生成された複数のクライアント/サーバーコードを組み合わせる場合を除いて、ビルドでsoapClientLib.cを使用しないでください。これは、soapClientLib.cにSOAPヘッダーと障害の共有シリアライザーが含まれていないことを意味します。

于 2014-06-07T18:06:33.617 に答える