我在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中找不到明确的答案。
答案 0 :(得分:1)
对于可能遇到类似问题的其他人,答案是确保源文件是C,而不是C ++。