首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libxml2 7中libxml2差异的条件编译

libxml2 7中libxml2差异的条件编译
EN

Stack Overflow用户
提问于 2013-09-19 11:55:39
回答 1查看 661关注 0票数 3

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

代码语言:javascript
复制
NSData * result = [[[NSData alloc] initWithBytes:outputBuffer->buffer->content 
                                  length:outputBuffer->buffer->use] autorelease];

导致编译错误“struct_xmlBuf类型定义不完整”。使用新的访问器方法,如下所示:

代码语言:javascript
复制
NSData * result = [[NSData alloc] initWithBytes:xmlOutputBufferGetContent(outputBuffer)
                                  length:xmlOutputBufferGetSize(outputBuffer)];

这很好,但是当在iOS 6上运行时,它会意外地崩溃,对于提到libxml2.2.dylib的新方法来说,“惰性符号绑定失败:符号未找到”。

如何有条件地进行此更改,以便使用base 7编译,并仍在iOS 5、6和7上运行?

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

我一直在努力并考虑:

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-20 21:35:41

如下所示应该是可行的:

代码语言:javascript
复制
#include <dlfcn.h>

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

然后:

代码语言:javascript
复制
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返回的函数指针将提高性能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18893959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档