You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL:自定义DLL中add_one函数匹配失败求助

问题解答

能否通过PgAdmin查看DLL中的函数列表?

不能。PgAdmin没有内置功能直接读取Windows DLL的导出函数列表,你需要借助系统工具或第三方工具查看:

  • 使用微软Visual Studio自带的dumpbin命令:
    dumpbin /exports "C:/Program Files/PostgreSQL/14/lib/new_func.dll"
    
    运行后会列出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:56:06