PostgreSQL:自定义DLL中add_one函数匹配失败求助
问题解答
能否通过PgAdmin查看DLL中的函数列表?
不能。PgAdmin没有内置功能直接读取Windows DLL的导出函数列表,你需要借助系统工具或第三方工具查看:
- 使用微软Visual Studio自带的
dumpbin命令:
运行后会列出DLL中所有导出的函数名,可直接检查dumpbin /exports "C:/Program Files/PostgreSQL/14/lib/new_func.dll"add_one是否在其中。 - 或使用Dependency Walker、PE Explorer等第三方工具可视化查看导出表。
解决"无法匹配函数add_one"的错误
以下是排查和修复的核心步骤:
1. 确保函数被正确导出到DLL
Windows平台下C函数默认不会被导出到DLL,这是最常见的触发原因。你需要通过两种方式之一显式导出add_one:
- 修改代码:在函数定义前添加
__declspec(dllexport)标记:#include "postgres.h" #include <string.h> #include "fmgr.h" #include "utils/geo_decls.h" PG_MODULE_MAGIC; PG_FUNCTION_INFO_V1(add_one); __declspec(dllexport) Datum add_one(PG_FUNCTION_ARGS) { int32 arg = PG_GETARG_INT32(0); PG_RETURN_INT32(arg + 1); } - 或使用.def文件:创建
new_func.def文件,内容如下,编译时将其加入项目:EXPORTS add_one
2. 验证DLL与PostgreSQL的兼容性
- 架构匹配:确保DLL的编译架构(32位/64位)与你的PostgreSQL 14完全一致(比如PostgreSQL是64位,DLL也必须是64位)。
- 版本匹配:编译DLL时使用的PostgreSQL头文件和库文件必须来自PostgreSQL 14,避免版本不兼容导致的符号匹配失败。
3. 确认DLL路径与文件名正确
- 检查
new_func.dll确实位于PostgreSQL的lib目录(即$libdir对应的C:/Program Files/PostgreSQL/14/lib)。 - 确保文件名拼写完全一致(Windows不区分大小写,但建议保持与
CREATE FUNCTION语句中的名称一致)。
4. 验证函数签名匹配
你的CREATE FUNCTION语句中参数和返回值类型是INTEGER,对应C代码中的int32,这部分是正确的。但需确保编译时未因编译器选项改变类型定义(比如禁用了PostgreSQL的类型别名)。
5. 重新编译并测试
修改代码或配置后,重新编译生成DLL,替换到PostgreSQL的lib目录,然后再次执行CREATE FUNCTION语句。如果仍有问题,用dumpbin确认add_one已出现在导出列表中。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

