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

时间:2013-09-19 11:55:39

标签: ios objective-c ios7 libxml2

使用iOS 7 SDK时,由于 libxml2 的更改,我不得不更改库的单行以使用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提及的新方法的“懒惰符号绑定失败:未找到符号”就不足为奇了。

如何通过基本SDK iOS 7编译并仍在iOS 5,6& 7?

注意:通常在运行时检查iOS版本与其他问题一样不足,因为旧行不再编译。

我一直在努力并考虑:

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

所有这些导致在编译之前或之后总是只选择一行,主要基于SDK。在非iOS项目(谷歌搜索)中处理这种变化的其他几个人似乎总是在编译一个版本的libxml。

1 个答案:

答案 0 :(得分: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之前),使用旧的缓冲区结构。对于较新版本,将使用dlsym搜索新的访问者。缓存dlsym返回的函数指针将提高性能。