【问题标题】:Compiling Windows PostgreSQL 9.5 64bit C-language functions编译 Windows PostgreSQL 9.5 64 位 C 语言函数
【发布时间】:2016-06-30 13:31:48
【问题描述】:

我想在 Windows 上为 PostgreSQL 9.5 64 位创建原生 C 扩展。

如果可能的话,我很想用 MinGW-w64 构建它们,以使我的构建链尽可能干净。但我正在使用 PostgreSQL 的 EnterpriseDB 构建,而 MinGW 构建使它崩溃。

如果我可以在这个商业项目中使用另一个免费的编译器,那也可以。

我知道如何让它与 Visual Studio 2003 Express 一起工作,但由于许可证问题,这似乎不是一个解决方案。

【问题讨论】:

  • Visual Studio 2015 社区“对个人开发者、开源开发、学术研究、教育和小型专业团队免费”:microsoft.com/en-us/download/details.aspx?id=48146
  • 为什么不用 gcc ?
  • @Boiethios:MinGW 是 gcc,只是打包为 Windows 的发行版。
  • 为什么投反对票?对于这个特定问题,花费 500 个代表还不够吗?
  • @我接受了switches的回答,虽然它没有让我满意地回答我的问题,但分数不应该丢失:)。

标签: c database windows postgresql postgresql-9.5


【解决方案1】:

主要答案的补充

article linked below 中,您可以阅读到可以使用 Mingw 或 Cygwin 编写 C 模块,以及一些相关指南。然而,我强烈反对这样做,主要是因为下面列出的原因,还因为该页面提到 那些 Windows 配置有特殊需求并且比大多数配置接受的测试更轻松;预计构建问题的发生率会更高

以下是类 Unix 平台的完整摘录:

类 Unix 平台

PGXS 起源于类 Unix 系统,在那里很容易使用。解压扩展模块存档并在生成的目录中运行这些命令:

make PG_CONFIG=path_to_postgresql_installation/bin/pg_config make PG_CONFIG=path_to_postgresql_installation/bin/pg_config install

如果在你的 shell 中运行类型 pg_config 找到正确的 PostgreSQL 安装,你可以省略 PG_CONFIG 覆盖。根据现有 PostgreSQL 安装目录的所有权,第二个命令通常需要 root 权限。这些说明也适用于使用 MinGW 或 Cygwin 编译器为 Windows 构建时。 但是,这些 Windows 配置有特殊需求,并且比大多数配置更轻松;预计构建问题的发生率会更高。

一个常见的错误是在“make”之前在命令行上指定 PG_CONFIG=...,这不起作用,因为该值随后会被 makefile 的内部工作覆盖。


重要的是要知道不同的编译器彼此不兼容。它们每个都有不同的运行时库。因此,使用不同于用于构建您正在使用的软件的编译器来编译扩展是非常危险的。

Postgresql 的 Windows 构建使用 Visual Studio,与 EnterpriseDB 相同(据我所知)。您将需要使用相同的编译器来构建您的扩展。

(更多信息请参考:Building and Installing PostgreSQL Extension ModulesPostgres Enterprise Manager Installation Guide - EnterpriseDB (PDF)

这应该可以解释为什么使用 Mingw-w64 编译的扩展程序会崩溃。

幸运的是,您可以选择两种解决方案:

  1. 使用Microsoft Visual Studio Community。它对个人开发者完全免费,但对企业有限制。它应该为您的 Postgresql 构建编译适当的模块。

  2. 使用 Mingw-w64 或您选择的任何其他编译器(可能是 LLVM/Clang)重新构建完整的 Postgresql 二进制文件,然后使用相同的编译器编译扩展。

执行其中任何一项都会对您有所帮助。这也适用于所有平台、语言和其他软件。如果您想为软件构建扩展,则需要在用于构建所用软件的同一平台上使用相同的编译器。

因此,如果您想在 Linux 上为 Postgresql 构建扩展,您需要相同的编译器(可能是 GCC)来构建扩展。

快乐编码 =)

【讨论】:

  • 感谢您的回答。但是我的问题专门询问我如何避免使用 Visual Studio!我已经尝试与 msvcr120.dll 链接,就像 PostgreSQL 一样,并且我的 MinGW 库会加载,但是每次我使用 msvcr120.dll 中的函数时,服务器都会崩溃。我一直在寻找允许我使用 MinGW 的开关或宏。
  • @Daniel 跟随我的第二步。使用 Mingw-w64 编译 postgresql 的源代码。我提供给 Postgresql wiki 的链接有一些关于相同的信息
  • @Daniel 我已经扩展了答案以满足您的需求 =)
  • 我不想用 mingw 重新构建 PostgreSQL,因为在一些性能比较中,我发现这些二进制文件比 EnterpriseDB 构建要慢一些。但我希望使用免费工具链构建我的扩展,因为我们希望像我们的软件一样保持我们的构建环境免费。
  • @Daniel 正如我所说,使用不同的编译器是个坏主意。但是,请考虑使用其他编译器,例如 LLVM。据我所知,GCC 的二进制文件比 Visual Studio 的更有效,如一些基准测试所示。但我会再检查一次。
【解决方案2】:

@Swith 为您提供文档how to build PostgreSQL Extension Modules with Visual Studio 的链接,您可以阅读:

这些说明也适用于使用 MinGWCygwin 编译器为 Windows 构建时。但是,那些 Windows 配置有特殊需求,并且比大多数配置更轻松;预计构建问题的发生率更高。

一个常见的错误是在“make”之前在命令行上指定 PG_CONFIG=...,这不起作用,因为该值随后会被 makefile 的内部工作覆盖。

你检查了吗?

您还可以阅读其他文档Building PostgreSQL With MinGW - 也许这对您有更多帮助。



如果我可以在这个商业项目中使用另一个免费的编译器,那也可以。

你检查了C compliers list on wiki - 特别是,你可以检查Cygwin 编译器 - 它在上面的文档中提到并且它是免费的。



我知道如何让它与 Visual Studio 2003 Express 一起工作,但由于许可证问题,这似乎不是一个解决方案。

你看到什么样的问题?


也许像@Simon Mourier 建议的那样检查Visual Studio 2015 Community Edition(不是快递)。

Express 版和 Community 版之间的许可完全不同 - 我不确定细节,但据我所知,Community 版在商业项目中使用更加灵活:

对于组织:
组织内不限数量的用户可以将 Visual Studio Community 用于以下场景:课堂学习环境、学术研究或为开源项目做出贡献。

对于所有其他使用场景:
在非企业组织中,最多五个用户可以使用 Visual Studio Community。 在企业组织中(即拥有超过 250 台 PC 或超过 100 万美元的组织)美元年收入),除上述开源、学术研究和课堂学习环境场景外,不允许使用。

有关详细信息,请参阅Visual Studio Community license terms

【讨论】:

  • 我不知道 Visual Studio Expess 的许可证到底是什么,因为我没有在网上找到它,我认为它类似于社区版许可证。
  • 这里是快速版的许可证:visualstudio.com/en-us/mt171551.aspx
  • 版本之间的主要区别在于功能......社区版就像“一体机”,但快速版按网络/移动/桌面划分
猜你喜欢
  • 2011-10-22
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 2010-10-09
  • 2012-07-26
  • 1970-01-01
相关资源
最近更新 更多