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