有条件地编译iOS 7中libxml2的差异

当使用iOS 7 SDK时,由于libxml2中的更改,我不得不更改一个库的一行,以使用xmloutput缓冲区的新输出缓冲区访问器方法。

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

导致编译错误“typesstruct_xmlBuf的不完全定义”。 使用新的访问器方法成为:

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

这工作正常,但是当在iOS 6上运行时,没有意外地发现与提及libxml2.2.dylib的新方法的“懒符号绑定失败:符号未find”。

你怎样才能有条件地做这种改变的方式,将与基础SDK iOS 7编译,仍然在iOS 5,6和7上运行?

注意:像其他问题一样,在运行时检查iOS版本是不够的,因为旧线路不再编译。

我一直在考虑和考虑:

  • 检查xmlOutputBufferGetContent != NULL ,始终为true
  • 使用libxml2.2而不是libxml2
  • 检查LIBXML_DOTTED_VERSION ,总是2.9.0
  • 检查LIBXML2_NEW_BUFFER定义的新方法始终为true

所有这些导致在编译之前或之后总是只select一行,主要基于SDK。 处理非iOS项目中这一变化的其他几个人(Google Googling)似乎总是针对一个版本的libxml进行编译。

像下面的东西应该工作:

 #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之前),使用旧的缓冲区结构。 对于较新的版本,使用dlsymsearch新的访问器。 caching由dlsym返回的函数指针将提高性能。