You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL 16中适配VARSIZE/SET_VARSIZE编译mapnik-german-l10n

解决Ubuntu 22.04编译mapnik-german-l10n时PostgreSQL 16宏未定义报错

问题场景

在Ubuntu 22.04上编译mapnik-german-l10n时,osml10n_translit.cpp文件触发编译错误,提示VARSIZE、VARDATA、SET_VARSIZE未定义。

原因分析

PostgreSQL 16对变长数据类型(TOAST支持)的相关接口做了调整,postgres.h中移除了PostgreSQL 15及更早版本存在的VARSIZE、VARDATA、SET_VARSIZE宏,导致原有代码无法适配新版本。

代码修改方案

将osml10n_translit.cpp中涉及这三个宏的代码替换为PostgreSQL 16兼容的接口:

  • 替换VARSIZE(ptr)为VARSIZE_ANY(ptr):获取变长数据的总大小(包含头部),兼容普通和TOAST压缩的数据
  • 替换VARDATA(ptr)为VARDATA_ANY(ptr):获取变长数据的实际内容指针,兼容普通和TOAST压缩的数据
  • 替换SET_VARSIZE(ptr, size)为SET_VARSIZE_ANY_EXHDR(ptr, size - VARHDRSZ):设置变长数据的总大小,size - VARHDRSZ为实际数据长度(减去头部大小)

示例修改

原代码片段:

int old_len = VARSIZE(old_val);
char* old_data = VARDATA(old_val);
SET_VARSIZE(new_val, new_len);

修改后:

int old_len = VARSIZE_ANY(old_val);
char* old_data = VARDATA_ANY(old_val);
SET_VARSIZE_ANY_EXHDR(new_val, new_len - VARHDRSZ);

修改完成后重新编译即可解决报错。

内容的提问来源于stack exchange,提问作者stackbiz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 14:23:19