【发布时间】:2014-04-14 12:12:44
【问题描述】:
我在获取一些简单的 postgres 测试函数以在 Windows 上链接和/或运行时遇到问题,我在命令行和 Visual Studio 中都进行了尝试。我找到的文档很少,也没有工作模板。
我不习惯 Windows 中的编译工具,而且我是 postgres 的新手,所以我可能会遗漏一些非常基本的东西。任何方向将不胜感激!
使用:Windows 8.0(64 位)、cl.exe 18.00.21005.1、link.exe 12.00.21005.1、PostgreSQL v.9.3.4(二进制安装)。
这是文档中的示例代码,只是为了简单起见,我只添加了 PGDLLEXPORT 调用:
#include "postgres.h"
#include "fmgr.h"
PG_MODULE_MAGIC;
PG_FUNCTION_INFO_V1(add_one);
PGDLLEXPORT Datum
add_one(PG_FUNCTION_ARGS)
{
int32 arg = PG_GETARG_INT32(0);
PG_RETURN_INT32(arg + 1);
}
在我的 cl 命令文件中,我收集了以下包含路径:
/I "C:\Program Files\PostgreSQL\9.3\include\server\port\win32_msvc"
/I "C:\Program Files\PostgreSQL\9.3\include\server\port\win32"
/I "C:\Program Files\PostgreSQL\9.3\include\server\port"
/I "C:\Program Files\PostgreSQL\9.3\include\server"
/I "C:\Program Files\PostgreSQL\9.3\include"
然后运行:
cl /c add.c @includes
link /DLL add.obj "C:\Program Files\PostgreSQL\9.3\lib\postgres.lib"
它编译和链接没有错误或警告。我把创建好的add.dll放到postgres\lib目录下,定义对应的函数用psql登录为用户postgres:
CREATE FUNCTION add_one(integer) RETURNS integer
AS 'add','add_one'
LANGUAGE C STRICT;
我得到以下错误:
ERROR: could not load library "C:/Program Files/PostgreSQL/9.3/lib/add.dll": %1 is not a valid Win32 application.
在 Visual Studio 中构建 dll 的结果是一样的。
我最初打算编写的扩展更复杂,还包括用于使用复合参数和返回的“funcapi.h”。在这种情况下,它也可以毫无问题地编译,但在链接阶段失败并出现此类错误:
error LNK2019: unresolved external symbol _get_call_result_type ...
error LNK2019: unresolved external symbol _BlessTupleDesc ...
error LNK2019: unresolved external symbol _heap_form_tuple ...
同样使用命令行或 MSVC,检查 lib 路径并尝试将 \lib 中所有可能的 .lib 依赖项添加到命令行。我也尝试了不同的调用约定。
但是,无论如何,我需要先让简单的 DLL 导出工作,也许解决方案与同一问题有关。
我猜这可能与 cl 包含的不匹配的系统默认值(32/64 位?)有关,但由于源仅包含来自 postgres 项目的标头,因此我希望自动解决我不知道该怎么做。
【问题讨论】:
标签: c windows postgresql