PostgreSQL:在Windows 8 64位上编译C函数

PostgreSQL:在Windows 8 64位上编译C函数,c,function,postgresql,triggers,C,Function,Postgresql,Triggers,我正在学习如何编译一个C触发器来加载PostgreSQL 编译“trigf.c”(在的示例中)时,我遇到了一些与int64错误(c.h头)相关的问题 ->[错误]#错误必须具有有效的64位整数数据类型 我不知道如何解决这个问题,因为很明显,我可以使用一个工作的64位整数数据类型 编辑:我从二进制文件安装了pgsql。我用来编译C函数文件的C编译器是MingWGCC4.7.2。(使用Dev cpp mingw gcc的路径) 命令行是: gcc-fpic-c“D:\trigf.c” 第一次,它在c

我正在学习如何编译一个C触发器来加载PostgreSQL

编译“trigf.c”(在的示例中)时,我遇到了一些与int64错误(c.h头)相关的问题

->[错误]#错误必须具有有效的64位整数数据类型

我不知道如何解决这个问题,因为很明显,我可以使用一个工作的64位整数数据类型

编辑:我从二进制文件安装了pgsql。我用来编译C函数文件的C编译器是MingWGCC4.7.2。(使用Dev cpp mingw gcc的路径)

命令行是: gcc-fpic-c“D:\trigf.c”

第一次,它在c.h中显示了一个错误:找不到libintl.h(没有这样的文件或目录)。然后我下载Lib Intl-0.14.4(用于本地语言支持的库)。安装程序将创建一个文件夹:C:\Program Files(x86)\GnuWin32。 我编辑了环境变量CPATH,添加了C:\ProgramFiles(x86)\GnuWin32\include文件夹,其中包含libintl.h


我再次运行了该命令,遇到了上述错误。

更新:事实证明,在Windows上独立使用MSVC构建扩展并不太困难。我


在Windows上构建扩展的常用方法是在工作的PostgreSQL构建树中进行

您可能可以使用MinGW并使用合适的Makefile来实现

仅仅尝试编译一个独立的
.c
文件不太可能工作,因为需要多种路径和预处理器定义


当前的PostgreSQL包没有包含公共依赖项的头,这是没有帮助的,这真的很令人沮丧。即使目标PostgreSQL是使用
ENABLE\u NLS
构建的,您也可以在不定义
ENABLE\u NLS
的情况下安全编译,在这种情况下,不需要
libintl.h

如何编译?确切的编译器/SDK版本?你是如何编译的?编译命令行/makefile/vs项目文件?需要更多信息。值得一提的是,我几乎总是编译Windows Pg扩展,方法是将扩展放在PostgreSQL源代码树的contrib/目录中,并使用
src/tools/msvc/build.pl contrib
HAVE_XXX
宏似乎指的是autoconf。在这个c.h之前有没有包含config.h?我已经编辑过了。希望你能帮忙@wildplasser
c.h
是PostgreSQL标题的一部分,顺便说一句,虽然它的名称很差。我现在已经写了一篇详细的博客文章解释了这一点。你能告诉我Pgsql构建树在哪里/是什么吗?我从Windows x64的分布式二进制文件安装了PostgreSQL。我需要下载Pqsql源代码并重新编译吗?@King正确,您需要获取源代码并按照上的说明进行操作。(我写了一个工具,使这个过程稍微容易一些)。在非Windows平台上,所有这些都不那么糟糕,您只需使用PGX来编译扩展。
#ifdef HAVE_LONG_INT_64
/* Plain "long int" fits, use it */

#ifndef HAVE_INT64
typedef long int int64;
#endif
#ifndef HAVE_UINT64
typedef unsigned long int uint64;
#endif
#elif defined(HAVE_LONG_LONG_INT_64)
/* We have working support for "long long int", use that */

#ifndef HAVE_INT64
typedef long long int int64;
#endif
#ifndef HAVE_UINT64
typedef unsigned long long int uint64;
#endif
#else
/* neither HAVE_LONG_INT_64 nor HAVE_LONG_LONG_INT_64 */
#error must have a working 64-bit integer datatype
#endif