折腾两天终于跑通:pgvector向量搜索扩展在Windows 11下的编译排坑实录
【免费下载链接】pgvectorOpen-source vector similarity search for Postgres项目地址: https://gitcode.com/GitHub_Trending/pg/pgvector
pgvector是PostgreSQL的向量相似度搜索扩展,让Postgres能对向量列做最近邻查询。我在Windows 11 + PostgreSQL 16上编译它,被报错卡了两天,最后发现是选错了编译器位数。
卡在哪里:最先吓到我的报错
我照着常规流程走:拉源码、开命令行、执行nmake。构建先是刷出一大片warning C4141: 'dllexport': used more than once,符号被重复声明导出。我一开始以为这是主犯,后来发现它只是警告。
真正的拦路虎是这个:
tupmacs.h(65): error C2196: case value '4' already used tupmacs.h(197): error C2196: case value '4' already used报错位置在PostgreSQL内部头文件tupmacs.h里,不在pgvector自己的源码文件里。switch分支里同一个case值被用了两次,编译器直接报错中断,DLL根本出不来。
排查路径:我先往错的方向走了
我先怀疑是符号冲突,去数据库里查了已装扩展列表,确认没有别的扩展重复定义同名符号;又执行了clean重新构建,结果一模一样。
接着怀疑PostgreSQL版本不兼容。我逐行看了Makefile.win,确认PGROOT指向的就是实际安装的PG16目录,头文件和库文件路径都对得上,排除环境配置问题。
转折点是我又看了一眼报错文件:tupmacs.h是PG头文件,里面的分支是靠SIZEOF_DATUM宏(Datum的大小,Datum可理解为Postgres通用的数据载体)做条件编译的。64位下它是8,分支不冲突;用32位编译器编译时它是4,switch里的分支就撞上了。
绕了一圈回头看我的命令行窗口——我一直用的是x86的Developer Command Prompt。项目Windows安装说明里写明了要用x64 Native Tools Command Prompt,我当时没留意这一句。
关键修复:切到x64编译环境的四步
T🔧 换环境不复杂,难在一把过:
- 打开 "x64 Native Tools Command Prompt for VS",别用普通Developer Command Prompt——原因:编译目标架构必须和64位Postgres对齐。
- 拉源码并进入目录:
git clone https://gitcode.com/GitHub_Trending/pg/pgvector,这就是扩展的完整源码。 - 声明PGROOT并执行构建:
set "PGROOT=C:\Program Files\PostgreSQL\16" nmake /F Makefile.win clean nmake /F Makefile.win nmake /F Makefile.win install- clean那一步不能省——把32位编译留下的obj清干净,否则新旧产物混着链接,还是会挂。
✅ 装完后执行CREATE EXTENSION vector;,能建向量列和索引就算彻底通了。
踩坑备忘:这些细节容易再犯
⚠️ 别凭窗口标题判断编译器位数。不确定就执行where cl,路径里带x86_amd64说明是32位。
- 换完环境先clean再构建,32位的obj混进来一定失败。
- C4141重复导出警告不影响DLL生成成功,别在它上面耗时间。
- PG 17.0到17.2会在链接阶段报
float_to_shortest_decimal_bufn,那是PG自身问题,升到17.3以上。 - install阶段报 Access is denied 就是权限不够,用管理员身份重跑。
一句话总结:Windows上编译扩展,先查编译器位数,再怀疑代码。建议把x64命令行固定成你的默认环境。
【免费下载链接】pgvectorOpen-source vector similarity search for Postgres项目地址: https://gitcode.com/GitHub_Trending/pg/pgvector
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考