在Windows环境中的PostgreSQL 9.1中创建函数

时间:2012-09-26 15:43:35

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

我在dll中创建了一个visual studio 2010文件,我尝试在dll中使用此PostgreSQL 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++兼容性。 任何知道如何处理这个问题的人?如何在Windows环境中的PostgreSQL中使用C ++删除该错误来创建函数?

1 个答案:

答案 0 :(得分:3)

您编译为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 ++,但如果您曾致电longjmp并收到错误,则Pg基于Pg -> C++ -> Pg的错误处理完全丢弃您的堆栈。说真的,不要这样做。保持你的C ++孤立。