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

时间:2016-08-01 05:22:35

标签: c++ visual-studio postgresql visual-studio-2015 linker

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

但是,与Notepad ++中的编码一样有趣,我决定在Visual Studio中创建一个项目。在几个小时的配置正确后,我可以让项目编译,但不能链接。

具体错误是:

  

错误LNK2019未解析的外部符号“double __cdecl   DatumGetFloat8(unsigned __int64)“(?DatumGetFloat8 @@ YAN_K @ Z)   在函数中引用“unsigned __int64 __cdecl wrapf64(struct   FunctionCallInfoData *)“   (?wrapf64 @@ YA_KPEAUFunctionCallInfoData @@@ Z)...   错误LNK2019未解析的外部符号“unsigned __int64 __cdecl   Float8GetDatum(double)“(?Float8GetDatum @@ YA_KN @ Z)在   function“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 vs C ++点吗?我在MSDN中找不到明确的答案。

1 个答案:

答案 0 :(得分:1)

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