pgvector Windows 编译报错:C4141 警告 + C2196 错误,完整排错一步到位
2026/9/6 21:49:48 网站建设 项目流程

pgvector Windows 编译报错:C4141 警告 + C2196 错误,完整排错一步到位

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

卡住现场:nmake 倒在 Postgres 官方头文件上

凌晨两点,Windows 11,Postgres 16(64 位),VS2022,pgvector 0.8.6。我照着说明执行nmake /F Makefile.win,先冒出两条 C4141 警告,接着 pgvector Windows 编译直接中断:

src\bitvec.c(43): warning C4141: 'dllexport': used more than once src\hnsw.c(190): warning C4141: 'dllexport': used more than once C:\Program Files\PostgreSQL\16\include\server\access/tupmacs.h(65): error C2196: case value '4' already used

先怀疑 pgvector 代码,再怀疑 Postgres 装坏了,折腾了半天,最后定位到是一行环境问题。

⚡ 快速结论:5 步修好 Windows 编译

只要答案的看这里:

  1. 打开 “x64 Native Tools Command Prompt for VS 2022”(管理员),别用 x86 或 ARM 终端
  2. 编译前把 PGROOT 指到 Postgres 安装目录:
set "PGROOT=C:\Program Files\PostgreSQL\16"
  1. 获取源码:
git clone --branch v0.8.6 https://gitcode.com/GitHub_Trending/pg/pgvector cd pgvector
  1. 清掉旧产物再编译、安装:
nmake /F Makefile.win clean nmake /F Makefile.win nmake /F Makefile.win install
  1. 日志里还有 C4141 就忽略,不影响vector.dll生成;报 C2196 说明你开的是 32 位终端,回第 1 步。

🧭 排查路径:倒推 C2196 的元凶

步骤现象结论
怀疑残留构建产物nmake /F Makefile.win clean后重编,报错不变排除旧 obj 干扰
读警告内容C4141 只出现在 bitvec.c / hnsw.c,编译没停警告不阻断构建,真问题在别处
聚焦错误行error C2196,出错位置在 Postgres 官方头文件 access/tupmacs.h不是 pgvector 代码的错,源码方向排除
怀疑 PG 安装损坏重新装 16.4 x64 验证,头文件正常排除 Postgres 本身问题
检查终端位宽发现我一直开的是 “x86 Native Tools Command Prompt”32 位工具链配 64 位头文件,坑锁定
换 x64 Native Tools,clean 后重编编译通过,只剩两条 C4141一步到位

关键线索在第三行:tupmacs.h 是 Postgres 自带的文件,真要是 pgvector 自己的问题,报错位置应该在src/下的 .c 文件里。

🔧 底层机制:32 位编译器为什么会报 tupmacs.h 错误

tupmacs.h 是 PostgreSQL 16 生成的头文件,定义表元组(tuple)的布局宏。它内部的switch按属性对齐方式分派,哪些分支被编译进来取决于当前编译器的指针宽度。64 位系统上 Datum 占 8 字节(SIZEOF_DATUM=8),x64 工具链和头文件天然自洽。

换成 x86 工具链后,条件编译走错分支,同一个值在 switch 里出现两次,MSVC 直接报 C2196。报错位置在官方头文件,锅却在终端:Postgres 装的是 64 位,头文件是 64 位的,只有编译器是 32 位。

C4141 是另一码事。Windows 下 PGDLLEXPORT 展开为__declspec(dllexport),pgvector 靠它导出扩展函数(见 src/vector.h、src/hnsw.h)。同一函数声明和定义都带了导出属性,MSVC 就提示 "used more than once"。纯警告,不阻断构建。

📋 避坑清单:编译前过一遍

  • 打开 “x64 Native Tools Command Prompt for VS”(不是 x86/ARM)——C2196 的唯一前置条件
  • 编译前执行set "PGROOT=C:\Program Files\PostgreSQL\16",指错会报Cannot open include file: 'postgres.h'
  • 每次重编前跑一次nmake /F Makefile.win clean,防止 32 位/64 位 obj 混用
  • Postgres 17.0–17.2 链接报unresolved external symbol float_to_shortest_decimal_bufn:升到 17.3+
  • install 阶段用管理员权限,报Access is denied就是权限问题
  • 装完跑CREATE EXTENSION vector;验证,\dx vector看到 0.8.6 才算闭环

❓ 常见疑问

C4141 警告直接无视行不行?行。它不阻断编译,只要最后 vector.dll 正常生成就没影响。来源是 PGDLLEXPORT 重复标注,不是环境问题,不用处理。

换 x64 终端后,源码要重新 clone 吗?不用。原地 clean 再编即可。唯一注意:如果之前 32 位编译留了 obj 文件,必须先nmake /F Makefile.win clean,否则旧产物会污染链接。

换成 WSL2 里编译行不行?可以,但那是 Linux 环境,走普通 make 流程,用不到 Makefile.win 和 nmake。不过 WSL 里编译出的扩展只能给 WSL 里的 Postgres 用,别混着装到 Windows 侧的 64 位 Postgres 上。

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

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

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

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

立即咨询