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