2016-08-01 71 views
1

我在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中找到明确的答案。

回答

1

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

相关问题