私はメモ帳++で一連のカスタムC PostgreSQL関数を書いています。 VS2015 x64ネイティブツールのコマンドラインユーティリティを使用してコードをコンパイルし、リンクしました。問題はなく、完璧に働いた。Visual StudioでPostgreSQLのカスタムC++プロジェクトをリンクする際のエラー
しかし、Notepad ++でのコーディングと同じくらい楽しいことですが、私はVisual Studioでプロジェクトを作成することにしました。数時間の設定が正しく行われた後、プロジェクトをコンパイルすることはできますが、リンクすることはできません。
特定のエラーは、次のとおりです。
エラーLNK2019未解決の外部シンボル "ダブル__cdecl DatumGetFloat8(符号なし__int64)" 機能「、符号なし__int64の__cdeclのwrapf64(構造体の中で参照(DatumGetFloat8 @@ YAN_K @ Z?) FunctionCallInfoData * Float8GetDatum(ダブル)__cdecl) " (?wrapf64 @@ YA_KPEAUFunctionCallInfoData @@@ Z)... エラーLNK2019未解決の外部シンボル "符号なし__int64"(?Float8GetDatum @@ YA_KN @ Z)が 機能で参照します"符号なし__int64 __cdecl wrapf64(struct FunctionCall ?私たちが見る
postgres.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))
:InfoData *)は、」(wrapf64 @@ YA_KPEAUFunctionCallInfoData @@@ Z)...
症状がfmgr.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
が見つからないときにコマンドラインリンカーで動作するのでしょうか?
提案がありますか?
もう1つ質問がありますが、元のコードはabs(double ...)
でしたが、VSの内側ではfabs(double ...)
を使用しています。これはC対C++ポイントですか?私はMSDNで明確な答えを見つけることができませんでした。