使用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
,始终为真LIBXML_DOTTED_VERSION
,始终为2.9.0 LIBXML2_NEW_BUFFER
定义的新方法,始终为真所有这些导致在编译之前或之后总是只选择一行,主要基于SDK。在非iOS项目(谷歌搜索)中处理这种变化的其他几个人似乎总是在编译一个版本的libxml。
答案 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
返回的函数指针将提高性能。