2016-08-01 11 views
1

私はメモ帳++で一連のカスタム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で明確な答えを見つけることができませんでした。

答えて

1

似たような問題が発生する可能性がある人は、ソースファイルがC++ではなくCであることを確認してください。

関連する問題