在Visual Studio中链接PostgreSQL自定义C++项目时出错

Error linking PostgreSQL custom C++ project in Visual Studio

本文关键字:C++ 项目 出错 自定义 PostgreSQL Visual Studio 链接      更新时间:2023-10-16

我在Notepad++中编写了一系列自定义的C PostgreSQL函数。我使用VS2015 x64 Native Tools命令行实用程序编译代码并将其链接。没有问题,工作非常完美。

但是,尽管用Notepad++编码很有趣,我还是决定在VisualStudio中创建一个项目。经过几个小时的正确配置,我可以编译项目,但不能链接。

具体错误为:

错误LNK2019未解析的外部符号"double__cdeclDatumGetFloat8(unsigned__int64)"(?DatumGETFoat8@@YAN_K@Z)在函数"unsigned __int64 __cdecl wrapf64(结构FunctionCallInfoData*)"(?wrapf64@@YA_KPEAUFunctionCallInfoData@@@Z)。。。错误LNK2019未解析的外部符号"unsigned __int64 __cdeclFloat8GetDatum(双)"(?Float8GetDatum@@YA_KN@Z)中引用函数"unsigned __int64 __cdecl wrapf64(struct FunctionCallInfoData*)"(?wrapf64@@YA_KPEAUFunctionCallInfoData@@@Z)…

症状出现在fmgr.h(我的评论):

/* these macros hide the pass-by-reference-ness of the datatype: */
#define PG_GETARG_FLOAT4(n)  DatumGetFloat4(PG_GETARG_DATUM(n))  // missing a definition
#define PG_GETARG_FLOAT8(n)  DatumGetFloat8(PG_GETARG_DATUM(n))  // missing a definition
#define PG_GETARG_INT64(n)   DatumGetInt64(PG_GETARG_DATUM(n))

postgres.h中,我们看到:

#ifdef USE_FLOAT8_BYVAL
extern float8 DatumGetFloat8(Datum X);
#else
#define DatumGetFloat8(X) (* ((float8 *) DatumGetPointer(X)))
#endif

没有#define。添加一个并不能解决问题。

相比之下:

#ifdef USE_FLOAT8_BYVAL
#define DatumGetInt64(X) ((int64) GET_8_BYTES(X))
#else
#define DatumGetInt64(X) (* ((int64 *) DatumGetPointer(X)))
#endif

这是PostgreSQL未经编辑的源代码,它是从命令行实用程序中运行的。VS内部有什么问题?或者,我应该说,当#define丢失时,为什么它在命令行链接器中工作?

有什么建议吗?

另一个问题是,我的原始代码有abs(double ...),但在VS中,我必须使用fabs(double ...)。这是C与C++的比较点吗?我在MSDN中找不到明确的答案。

对于其他可能有类似问题的人,答案是确保源文件是C,而不是C++。