pgvector Windows 编译报错?C2196 与 C4141 两个错误一次修完
2026/9/15 11:17:31 网站建设 项目流程

pgvector Windows 编译报错?C2196 与 C4141 两个错误一次修完

【免费下载链接】pgvectorOpen-source vector similarity search for Postgres项目地址: https://gitcode.com/GitHub_Trending/pg/pgvector

pgvector 的 Windows 编译翻车,多半不是你的代码问题——C2196 和 C4141 这两类报错基本都是环境姿势错了。照着下面五步走完,10 分钟内能修好。

一、开工前 3 分钟:环境对号入座

先把你的环境摆到桌面上比一比:

项目要求说明
操作系统Windows 10/11 64 位32 位系统直接放弃
PostgreSQL16 或 17,必须是 64 位版本32 位版会触发下面的 C2196
编译器Visual Studio Build Tools 2022(C++ 桌面工作负载)用 vcvars64 环境,不是 vcvars32
pgvector 源码最新版(仓库当前为 0.8.6)老版本在 Windows 上本身有坑

Datum——PostgreSQL 里装任意一行数据值的通用"占位格",64 位系统下占 8 字节——它的大小直接决定头文件里走哪段分支,这也是后文报错的关键。

二、现象对照:你的报错属于哪一类

先看两种典型日志,只保留最关键的几行:

tupmacs.h(65): error C2196: case value '4' already used src\hnsw.c(190): warning C4141: 'dllexport': used more than once

……(其余行省略)

现象嫌疑原因
tupmacs.h 报 C2196 "case value '4' already used"用了 32 位编译环境,SIZEOF_DATUM(Datum 占位格字节数的宏)取错分支,PostgreSQL 头文件内部自相矛盾
C4141 "dllexport used more than once"同一符号被多处导出声明,常见于源码版本偏老;新版 pgvector 已收敛
!error PGROOT is not set编译环境没设置 PGROOT,Makefile.win 第一道检查就拦住你

三、分步修复:三步走通

第 1 步:换成 64 位编译环境。关键是让工具链的位数和 PostgreSQL 的安装位数对齐。

"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"

进入 64 位 MSVC 环境,别用 vcvars32.bat

做完后应看到命令行里出现64-bit x64字样,且cl命令可用。

第 2 步:设置 PGROOT 并拉取源码编译。编译脚本要找到 PostgreSQL 的安装根目录。

set PGROOT=C:\Program Files\PostgreSQL\16 git clone https://gitcode.com/GitHub_Trending/pg/pgvector cd pgvector nmake /F Makefile.win

做完后应看到vector.dll生成,src 下的 .c 文件逐个编译通过,没有 C2196。

第 3 步:安装到 PostgreSQL。把生成的 dll 和 SQL 文件放进安装目录。

nmake /F Makefile.win install

做完后应看到文件被拷入%PGROOT%\lib%PGROOT%\share\extension,无 error 输出。

四、结果验收:两条命令确认修好

打开 psql 跑最小验证:

CREATE EXTENSION vector; SELECT vec_l2_squared_distance(ARRAY[1,2,3]::vector, ARRAY[1,2,3]::vector);

看到第一条不报 "could not open extension control file"、第二条返回0,就算彻底修好了。想再放心一点,可以跑 test/t/ 里的 Perl 回归用例。

五、防复发清单

  • ✅ 装 PostgreSQL 时确认版本页选的是 64-bit,装完用SELECT version();复核一次
  • ✅ 编译前先看cl输出的位数提示,64 位 PostgreSQL 只配 vcvars64
  • ✅ pgvector 保持拉最新代码再编译,老 tag 在 Windows 上有已知缺陷
  • ✅ 换机器时把 PGROOT 记下来,它指向的是含include/server的那个安装目录

修好之后,你可以顺手把 Makefile.win 里的OPTFLAGS填上目标 CPU 的/arch参数,让向量距离计算用上你机器的 SIMD 指令集。

【免费下载链接】pgvectorOpen-source vector similarity search for Postgres项目地址: https://gitcode.com/GitHub_Trending/pg/pgvector

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询