c++ - 在 Windows 环境下在 PostgreSQL 9.1 中创建函数

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

我在 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.

我使用64位windows.i检查了PostgreSQL关于C语言函数和动态加载的文档,它说

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif 

应该包含动态加载,但它没有说明任何关于C++兼容性的信息。 有人知道如何处理这个问题吗?我如何消除该错误,以便在 Windows 环境中使用 PostgreSQL 中的 C++ 创建函数?

最佳答案

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

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

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

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

关于c++ - 在 Windows 环境下在 PostgreSQL 9.1 中创建函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12605512/

相关文章:

c++ - popen 挂起并导致 CPU 使用率达到 100

c++ - Eclipse CDT 中的格式(换行)构造函数初始化程序列表

sql - 按时间顺序排列 Postgresql 表结果

postgresql - 连接数据库后切换角色

c++ - 这是系统资源吗? (或者我怎么知道我是否需要删除指针)- 在 C++ 中使用 C

c++ - 创建新数组时访问冲突写入位置

visual-studio - F# 和 Visual Studio 2010 Express 版?

c# - 为什么 VS2010 "Lose"我的引用构建?

c# - Visual Studio 2010 是否支持 Eclipse 的 "Generate delegate methods"之类的东西?

postgresql - 如何在时间间隔之间获取行