我在 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 基于
并得到一个错误。说真的,不要这样做。让您的 C++ 保持隔离。longjmp
的错误处理将会完全破坏您的堆栈-> Pg
关于c++ - 在 Windows 环境下在 PostgreSQL 9.1 中创建函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12605512/