2016-08-01 69 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++。

相關問題