我在Windows上尝试通过命令行和Visual Studio获取一些简单的PostgreSQL测试函数,并使其链接和/或运行存在问题。我发现很少有文档,也没有有效的模板可用。
我不熟悉Windows上的编译工具,而且我对PostgreSQL也是新手,可能会错过一些非常基本的东西。如有任何指导,将不胜感激!
使用的工具为:Windows 8.0(64位),cl.exe 18.00.21005.1,link.exe 12.00.21005.1,PostgreSQL v.9.3.4(二进制安装)。
以下是来自文档的示例代码,只是为了有一个简单的例子,我添加了PGDLLEXPORT调用:
在我的cl命令文件中,我收集了以下包含路径:
无论是使用命令行还是MSVC,都要检查库路径并尝试将所有可能的.lib依赖项添加到命令行中。我还尝试了不同的调用约定。
但无论如何,我首先需要让简单的DLL导出正常工作,也许解决方案与相同问题有关。
我猜想这可能与cl包含的系统默认值不匹配(32/64位?)有关,但由于源代码只包括来自postgres项目的头文件,我希望这会被自动解决,但我不知道该怎么处理。
我不熟悉Windows上的编译工具,而且我对PostgreSQL也是新手,可能会错过一些非常基本的东西。如有任何指导,将不胜感激!
使用的工具为: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目录中,并在以用户postgres身份登录的psql中定义相应的函数:
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依赖项添加到命令行中。我还尝试了不同的调用约定。
但无论如何,我首先需要让简单的DLL导出正常工作,也许解决方案与相同问题有关。
我猜想这可能与cl包含的系统默认值不匹配(32/64位?)有关,但由于源代码只包括来自postgres项目的头文件,我希望这会被自动解决,但我不知道该怎么处理。