我在visual studio 2010
中创建了一个visual studio 2010
文件,我试图在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
中创建函数时,如何删除该错误?
发布于 2012-09-26 16:19:29
您是编译为C
还是C++
?如果您使用C++
,您将需要按照用C++编写扩展程序将您的PG_MODULE_MAGIC
封装在extern "C"
块中。
如果可能的话,只需编写普通的c
并将其编译为普通的c
,不要让C++出现在图片中。将C++代码混合到PostgreSQL中既复杂又困难,因此对于初学者来说这不是一件好事。
如果您绝对必须使用C++,最明智的方法是用C++编写代码,将extern "C"
接口公开给它,其中C++对象作为不透明的void
指针或指向空结构类型的指针传递。然后使用您公开的纯c
接口来编写Pg模块。有一些像大口这样的工具可以帮助生成这样的包装,但是对于Pg模块这样的东西来说,它通常并不是必需的。
您可以谨慎地在Pg模块中直接使用C++,但是如果您调用Pg -> C++ -> Pg
并得到错误,Pg的基于longjmp
的错误处理将完全破坏您的堆栈。说真的别这么做。保持您的C++隔离。
https://stackoverflow.com/questions/12605512
复制