3

iOS 7 SDK を使用している場合、libxml2の変更により、ライブラリの 1 行を変更して、xmloutput バッファーの新しい出力バッファー アクセサー メソッドを使用する必要がありました。

NSData * result = [[[NSData alloc] initWithBytes:outputBuffer->buffer->content 
                                  length:outputBuffer->buffer->use] autorelease];

コンパイル エラー「型 struct_xmlBuf の定義が不完全です」が発生しました。新しいアクセサ メソッドを使用すると、次のようになりました。

NSData * result = [[NSData alloc] initWithBytes:xmlOutputBufferGetContent(outputBuffer)
                                  length:xmlOutputBufferGetSize(outputBuffer)];

これは問題なく動作しますが、iOS 6 で実行すると、libxml2.2.dylib に言及している新しいメソッドに対して「lazy symbol binding failed: Symbol not found」というエラーが表示されて驚くほどクラッシュしません。

ベース SDK iOS 7 でコンパイルし、iOS 5、6、および 7 で引き続き実行する方法で、条件付きでこの変更を行うにはどうすればよいですか?

注: 古い行はもはやコンパイルされないため、他の問題のように実行時に iOS バージョンをチェックする通常の方法では不十分です。

私は試み、検討してきました:

  • チェックxmlOutputBufferGetContent != NULL中、常に真
  • libxml2 の代わりに libxml2.2 を使用する
  • チェックLIBXML_DOTTED_VERSION中、常に 2.9.0
  • LIBXML2_NEW_BUFFER定義された新しいメソッドのチェック、常に true

これらはすべて、主に SDK に基づいて、コンパイルの前後に常に 1 行だけが選択されるという結果になります。iOS 以外のプロジェクト (グーグル) でこの変更を扱っている他の少数の人々は、常に libxml の 1 つのバージョンを対象としてコンパイルしているようです。

4

1 に答える 1

1

次のようなものが機能するはずです。

#include <dlfcn.h>

typedef const xmlChar *(*getContent_t)(xmlOutputBufferPtr out);
typedef size_t (*getSize_t)(xmlOutputBufferPtr out);

それで:

int libxmlVersion = atoi(xmlParserVersion);

if (libxmlVersion < 20900) {
    xmlBufferPtr oldStyleBuffer = (xmlBufferPtr)outputBuffer->buffer;
    NSData * result = [[[NSData alloc] initWithBytes:oldStyleBuffer->content 
                              length:oldStyleBuffer->use] autorelease];
}
else {
    getContent_t getContent = dlsym(RTLD_DEFAULT, "xmlOutputBufferGetContent");
    getSize_t getSize = dlsym(RTLD_DEFAULT, "xmlOutputBufferGetSize");
    NSData * result = [[NSData alloc] initWithBytes:getContent(outputBuffer)
                              length:getSize(outputBuffer)];
}

古いバージョンの libxml2 (2.9.0 より前) では、古い buffer 構造体が使用されます。新しいバージョンの場合、新しいアクセサは を使用して検索されdlsymます。によって返される関数ポインターをキャッシュするdlsymと、パフォーマンスが向上します。

于 2013-09-20T21:35:41.723 に答える