0

私は本当にこの問題で立ち往生しています...そして、ここで私を助けてくれることを願っています.

セキュリティで保護された SOAP Web サービスを使用する必要がある企業向けの iPad アプリを開発しています...完璧な組み合わせではありません! 私が知っていることは、グーグルを見回して、「最善の」ことはgSOAPを使用してWSクライアントを作成することであることがわかりました。それが私がしたことです! 今、私は C++ でこれらの WS の 1 つのクライアントを持っています。

WS のメソッドの 1 つを呼び出してアプリをビルドしようとすると、次のようになります。

Ld /Users/me/Library/Developer/Xcode/DerivedData/App-akcairabnqiunvddtmwphaispprl/Build/Products/Debug-iphonesimulator/App.app/App normal i386
cd /Users/me/iOS/App

setenv MACOSX_DEPLOYMENT_TARGET 10.6

setenv PATH '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin'

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch i386 -isysroot 
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk 
-L/Users/me/Library/Developer/Xcode/DerivedData/App-akcairabnqiunvddtmwphaispprl/Build/Products/Debug-iphonesimulator 
-L/Users/me/iOS/App -F/Users/me/Library/Developer/Xcode/DerivedData/App-akcairabnqiunvddtmwphaispprl/Build/Products/Debug-iphonesimulator 
-F/Applications/Xcode.app/Contents/Developer/Library/Frameworks 
-filelist /Users/me/Library/Developer/Xcode/DerivedData/App-akcairabnqiunvddtmwphaispprl/Build/Intermediates/App.build/Debug-iphonesimulator/App.build/Objects-normal/i386/App.LinkFileList 
-mmacosx-version-min=10.6 -Xlinker -objc_abi_version -Xlinker 2 -fobjc-arc -Xlinker -no_implicit_dylibs -D__IPHONE_OS_VERSION_MIN_REQUIRED=50100 
-framework SenTestingKit -framework Foundation -framework UIKit -framework QuartzCore -framework CoreGraphics -ldataSOAPlibDev 
-o /Users/me/Library/Developer/Xcode/DerivedData/App-akcairabnqiunvddtmwphaispprl/Build/Products/Debug-iphonesimulator/App.app/App

ld: warning: ignoring file /Users/me/iOS/App/libdataSOAPlibDev.a, 

リンクされているアーキテクチャではないアーカイブ用にファイルがビルドされました (i386)

Undefined symbols for architecture i386:

    'soap::soap()', referenced from:
  -[ViewContratosController viewDidLoad] in ViewContratosController.o
  '_soap_init_LIBRARY_VERSION_REQUIRED_20808', referenced from:
  -[ViewContratosController viewDidLoad] in ViewContratosController.o
 'soap_call_ns1__obtenerPais(soap*, char const*, char const*, ns2__paisFile*,     
  ns1__obtenerPaisResponse&)', referenced from:
  -[ViewContratosController viewDidLoad] in ViewContratosController.o
 'soap::~soap()', referenced from:
  -[ViewContratosController viewDidLoad] in ViewContratosController.o
 'ns2__paisFile::soap_default(soap*)', referenced from:
  ns2__paisFile::ns2__paisFile() in ViewContratosController.o
 'vtable for ns2__paisFile', referenced from:
  ns2__paisFile::ns2__paisFile() in ViewContratosController.o

注: vtable が見つからないということは、通常、最初の非インライン仮想メンバー関数に定義がないことを意味します。 ld: アーキテクチャ i386 のシンボルが見つかりませんでした。

注は問題を教えてくれるかもしれません...しかし、私はそれを解決する方法がわかりません...何かアイデアはありますか?

ありがとう!

4

2 に答える 2

0

わかった!WSを消費しようとしている.mmファイルにgSOAPによって生成されたヘッダーとnsmapを含めて(インポートせずに)解決しました...

#include "soapH.h"
#include "soapStub.h"
#include "soapdataServiceSoapBindingProxy.h"
#include "dataServiceSoapBinding.nsmap"

gSOAPによって作成されたWSクライアントから静的ライブラリを作成する場合は、ライブラリプロジェクトの「ビルドフェーズ」に十分注意してください...ヘッダーコンパイルソースを慎重に追加してください。

その後...iOSプロジェクトに、同じフォルダーの下にヘッダーとXMLを含む「 lib.a をインポートします。そして、次のようなことを行うWSを呼び出します。

dataServiceSoapBinding service;
ns2__countryFile country;
struct ns1__getCountryResponse response;

country.idCountry = 11;

if(service.ns1__getCountry(&country, response) == SOAP_OK) {
    NSLog(@"ok");
} else {
    NSLog(@"ERROR");
}

これが誰かに役立つことを願っています...私はこれを理解するのにとても苦労したので...そしてそれについて多くの情報を見つけられませんでした!

:)

于 2012-04-13T11:45:30.740 に答える
0

問題はおそらく、iPAd (ARM アーキテクチャ) 用のライブラリを使用して、シミュレータ (i386 アーキテクチャ) にビルドしようとしたことです。代わりに、実際のデバイスにビルドしてみてください。

私にとってのヒントは次のとおりです。

ld: 警告: ファイル /Users/me/iOS/App/libdataSOAPlibDev.a を無視します。ファイルは、リンクされているアーキテクチャではないアーカイブ用にビルドされました (i386)

于 2012-04-12T07:37:12.227 に答える