2016-10-10 10 views
1

v9.6、win server 2012、vs 2015 x64として正常にコンパイルされ、リンクされています。サンプルC関数がWindows版で動作しています

dllに「add_one」関数がないことを示す関数の作成に失敗しました。

postgres=# create function add_one(integer) returns integer as 
'win32project1',' add_one' language c strict; 

ERROR: could not find function "add_one" in file "C:/Program Files/PostgreSQL/9.6/lib/win32project1.dll" 

機能は、DUMPBINは

 1 0 000112CB Pg_magic_func = @ILT+710(Pg_magic_func) 
     2 1 00011087 pg_finfo_add_one = @ILT+130(pg_finfo_add_one) 
     3 2 00011190 pg_finfo_add_one_float8 = @ILT+395(pg_finfo_add_one_float8) 
     4 3 000110F5 pg_finfo_concat_text = @ILT+240(pg_finfo_concat_text) 
     5 4 000112C1 pg_finfo_copytext = @ILT+700(pg_finfo_copytext) 
     6 5 0001107D pg_finfo_makepoint = @ILT+120(pg_finfo_makepoint) 

答えて

1

OKを言いますけれども、各機能用にエクスポート2つの機能、メタデータ機能pg_finfo_xxxプラス実際の機能があることが必要があるように思われますそれ自体はxxxです。

コンパイルするpg関数の標準ヘッダーは、PGDLLEXPORTでメタデータ関数をマークしますが、実際の関数の前方宣言はそのようにマークされません。私はこれがどのように動作するのか見ていない。

#define PG_FUNCTION_INFO_V1(funcname) \ 
Datum funcname(PG_FUNCTION_ARGS); \ 
extern PGDLLEXPORT const Pg_finfo_record * CppConcat(pg_finfo_,funcname)(void); \ 
const Pg_finfo_record * \ 
CppConcat(pg_finfo_,funcname) (void) \ 
{ \ 
    static const Pg_finfo_record my_finfo = { 1 }; \ 
    return &my_finfo; \ 
} \ 
extern int no_such_variable 

しかし、私はあなたのソースファイルを示さなかったが、それは、この含まれている必要があり

#define PG_FUNCTION_INFO_V1(funcname) \ 
PGDLLEXPORT Datum funcname(PG_FUNCTION_ARGS); \ 
extern PGDLLEXPORT const Pg_finfo_record * CppConcat(pg_finfo_,funcname)(void); \ 
const Pg_finfo_record * \ 
CppConcat(pg_finfo_,funcname) (void) \ 
{ \ 
    static const Pg_finfo_record my_finfo = { 1 }; \ 
    return &my_finfo; \ 
} \ 
extern int no_such_variable 
0

を行うことによって、それが働かせた:そして、それはおそらく動作します

extern PGDLLEXPORT Datum add_one(PG_FUNCTION_ARGS); 

PG_FUNCTION_INFO_V1(add_one); 

を。

PostgreSQLでyour answerを実装するのにdiscussion on the hackes mailing listを開始しましたが、PostgreSQLが使用している(エクスポート定義ファイルを生成して使用する)ビルドプロセスでは、少なくとも警告が発生するため、あきらめてしまいました。

あなたが持っているもう1つのオプションは、PostgreSQLのようにエクスポート定義ファイルを作成して使用することです。それでは、PGDLLEXPORTデコレーションを一切使わなくてもかまいません。

+0

ソースファイルを9.6のdocページから直接コピーしました。https://www.postgresql.org/docs/9.6/static/xfunc-c.html#XFUNC-C-DYNLOAD – pm100

+0

yrの提案は機能しますが、 PG_FUNCTION_INFOにPGDLLEXPORTがあると、この余分な行は必要ありません – pm100

+0

ドキュメントのサンプルはWindowsを対象としていません。それは間違いです。私はパッチを提案します。 –

関連する問題