【问题标题】:Creating functions in PostgreSQL 9.1 in Windows Enviroment在 Windows 环境中在 PostgreSQL 9.1 中创建函数
【发布时间】:2012-09-26 15:43:34
【问题描述】:

我在visual studio 2010 中创建了一个dll 文件,我试图在PostgreSQL 9.1 中使用这个dll 来创建一个函数,但我收到了这个错误:

ERROR:  incompatible library "D:\visual_studio\DynamicLibrary\x64\Debug\funxx.dll":    
 missing magic block

HINT:  Extension libraries are required to use the PG_MODULE_MAGIC macro.

我正在使用64bits windows.i 检查PostgreSQL 关于C 语言功能和动态加载的文档,它说

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif 

应该包含dynamic loading,但它没有说明C++ 的兼容性。 任何知道如何处理这个问题的人?我怎样才能消除该错误以在 Windows 环境中使用 C++ 在PostgreSQL 中创建函数?

【问题讨论】:

标签: c++ visual-studio-2010 postgresql dll dynamic-loading


【解决方案1】:

您编译为C 还是C++?如果您使用了C++,则需要按照writing extensions in C++PG_MODULE_MAGIC 包装在extern "C" 块中。

如果可能的话,只需编写普通的c 并编译为普通的c,不要使用 C++。将 C++ 代码混合到 PostgreSQL 中既复杂又困难,所以对于初学者来说这不是一件好事。

如果您绝对必须使用 C++,最明智的方法是用 C++ 编写代码,向它公开 extern "C" 接口,其中 C++ 对象作为不透明的 void 指针或指向空结构类型的指针传入和传出。然后使用您公开的纯c 接口来编写您的Pg 模块。有像 SWIG 这样的工具可以帮助生成这样的包装器,但是对于像 Pg 模块这样的东西通常不需要。

您可以谨慎地直接在 Pg 模块中使用 C++,但是如果您调用 Pg -> C++ -> Pg 并收到错误,Pg 基于 longjmp 的错误处理完全破坏您的堆栈。说真的,不要这样做。保持 C++ 隔离。

【讨论】:

    猜你喜欢
    • 2021-11-29
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 2019-12-09
    • 1970-01-01
    相关资源
    最近更新 更多