gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:20:32 26 4
gpt4 key购买 nike

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

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 的新方法,它会因“惰性符号绑定(bind)失败:未找到符号”而意外崩溃。

您如何有条件地进行此更改,使其能够使用基本 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 进行编译。

最佳答案

像下面这样的东西应该可以工作:

#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 返回的函数指针将提高性能。

关于ios - 有条件地编译 iOS 7 中 libxml2 的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18893959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com