在Visual Studio 2017中编译PostgreSQL C扩展遇问题求助
解决VS2017编译PostgreSQL扩展时c.h头文件错误的方案
我之前在Windows下用VS编译PostgreSQL扩展时也踩过类似的坑,给你几个实际可行的排查和解决方向:
确认PostgreSQL开发包与VS版本兼容
要保证你下载的PostgreSQL开发包(包括头文件和库)是用VS2017编译的版本,不同VS版本的CRT(C运行时库)差异会导致头文件兼容性问题。同时检查项目的「附加包含目录」是否正确指向了PostgreSQL的include和include\postgresql\server目录,避免引用到其他版本的PostgreSQL头文件。定位具体错误信息,针对性解决
你提到修改string.h引用后仍受阻,建议先把错误提示完整梳理出来——比如是「未定义标识符」「语法错误」还是「类型不匹配」?举个例子,如果是c.h里的Size类型未定义,那大概率是没在项目预处理器里添加PostgreSQL的版本宏(比如PG_VERSION_NUM=90600,对应9.6版本),或者没包含正确的依赖头文件。调整项目编译与链接设置
这几个设置很关键,别漏了:- 项目属性 → C/C++ → 预处理器 → 预处理器定义,添加
WIN32、_WIN32以及对应PostgreSQL版本的宏(比如你的PostgreSQL是10.x,就加PG_VERSION_NUM=100000); - C/C++ → 常规 → 附加包含目录,确保
$(PostgreSQLDir)\include和$(PostgreSQLDir)\include\server排在系统头文件路径前面; - C/C++ → 高级 → 编译为,选择「C代码(/TC)」,因为PostgreSQL的服务器端代码是纯C写的,用C++编译会有语法兼容问题;
- 链接器 → 附加库目录,添加
$(PostgreSQLDir)\lib,然后在「输入」里添加postgres.lib和libpq.lib。
- 项目属性 → C/C++ → 预处理器 → 预处理器定义,添加
还原
c.h的修改,避免破坏依赖链c.h作为PostgreSQL服务器端的核心头文件,本身的引用逻辑是严谨的,手动修改成string.h可能会导致其他依赖头文件无法正确加载。建议把你改的地方还原,然后检查是不是项目的标准库包含路径有问题,或者预定义宏缺失导致string.h的内容没有正确展开。
内容的提问来源于stack exchange,提问作者JustMe
相关产品推荐
相关产品推荐

