我在Notepad ++中编写了一系列自定义C PostgreSQL函数。我使用了VS2015 x64 Native Tools命令行工具来编译代码并将其链接起来。没有问题,工作完美。在Visual Studio中连接PostgreSQL自定义C++项目时出错
但是和Notepad ++中的编码一样有趣,我决定在Visual Studio中创建一个项目。经过几个小时的正确配置,我可以让项目编译,但不能链接。
具体的错误是:
错误LNK2019解析的外部符号 “双__cdecl DatumGetFloat8(无符号__int64)”(DatumGetFloat8 @@ YAN_K @ Z?) 函数引用“无符号__int64 __cdecl wrapf64(结构 FunctionCallInfoData *) “ (?wrapf64 @@ YA_KPEAUFunctionCallInfoData @@@ Z)... 错误LNK2019解析的外部符号 ”无符号__int64 __cdecl Float8GetDatum(双)“(?Float8GetDatum @@ YA_KN @ Z)在 函数引用” unsigned __int64 __cdecl wrapf64(struct FunctionCall ?INFODATA *)”(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中找到明确的答案。