我在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 ++删除该错误来创建函数?
答案 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 ++孤立。