PostgreSQL 13安装Apache AGE 1.3.0时出现undefined symbol错误求助
编译安装PostgreSQL 13 + Apache AGE 1.3.0时加载age.so提示undefined symbol: hash_any_extended的解决方法
问题场景
- 源码编译PostgreSQL 13(REL_13_STABLE分支)
- 搭配官方标注兼容的Apache AGE 1.3.0(release/PG13/1.3.0分支)
- 执行
CREATE EXTENSION age;时触发错误:
postgres=# CREATE EXTENSION age; ERROR: could not load library "/usr/local/pgsql-13/lib/age.so": /usr/local/pgsql-13/lib/age.so: undefined symbol: hash_any_extended
- 已确认
age.so存在于指定目录,但仍报版本兼容类错误
错误原因
hash_any_extended是PostgreSQL 14及以上版本才引入的哈希函数接口,PostgreSQL 13并不包含该函数。出现这个问题的核心原因是编译AGE时,系统中存在更高版本的PostgreSQL开发头文件或库,导致AGE编译时错误链接到了高版本PG的接口,而非你指定的PG13。
即便你切换到了PG13兼容的AGE分支,如果编译环境的pg_config指向高版本PostgreSQL(比如14+),或者系统中预先安装了高版本PG的开发包,AGE会默认使用高版本的接口编译,最终生成的age.so依赖14+的函数,在PG13环境中加载自然会触发未定义符号的错误。
解决方法
1. 强制指定PG13的编译环境
编译AGE前,必须明确指定PG13的pg_config路径,避免系统默认的高版本PG干扰:
# 进入AGE源码目录 cd age # 清理之前的编译残留 make clean # 指定PG13的pg_config路径(替换为你的实际安装路径) PG_CONFIG=/usr/local/pgsql-13/bin/pg_config make # 安装到PG13的扩展目录 PG_CONFIG=/usr/local/pgsql-13/bin/pg_config make install
2. 清理系统中的高版本PG开发文件
如果系统中安装了PostgreSQL 14+的开发包,建议暂时卸载,防止编译时被优先调用:
- Debian/Ubuntu系统:
sudo apt remove postgresql-server-dev-14
- RHEL/CentOS系统:
sudo yum remove postgresql14-devel
3. 验证编译环境的正确性
编译前先确认pg_config指向的是PG13:
/usr/local/pgsql-13/bin/pg_config --version # 正确输出应为:PostgreSQL 13.x
4. 重启服务并重新创建扩展
完成上述步骤后,重启PostgreSQL 13服务,再执行扩展创建命令:
# 重启PG13服务(根据你的启动方式调整) sudo systemctl restart postgresql-13 # 进入psql执行 CREATE EXTENSION age;
内容的提问来源于stack exchange,提问作者ahmed_131313
相关产品推荐
相关产品推荐

