2

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

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++兼容性。任何知道如何处理此问题的人?我如何删除该错误以PostgreSQL在 Windows 环境中使用 C++ 创建函数?

4

1 回答 1

3

你编译为C还是 as C++?如果您使用过C++,则需要按照在 C++ 中编写扩展的PG_MODULE_MAGIC方式将您的内容包装在一个extern "C"块中。

如果可能的话,只需编写 plainc并 compile as plain c,将 C++ 排除在外。将 C++ 代码混合到 PostgreSQL 中既复杂又困难,因此对于初学者来说这不是一件好事。

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

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

于 2012-09-27T00:19:29.150 回答