2016-07-21 3 views
0

私は、Windowsの別のDLLに依存するモジュールからPostgreSQLでC言語関数を作成することに成功しなかった。PostgreSQLにDLLに依存するCモジュールをロードする方法は?

例えば、自分自身のDLLにあるnumber関数によって返された2つの数値を加算するsum関数を作成したいとします。

number.hためのコードは次のとおり

#ifndef NUMBER_H 
#define NUMBER_H 

#ifdef NUMBER_EXPORTS 
#define NUMBER_API __declspec(dllexport) 
#else 
#define NUMBER_API __declspec(dllimport) 
#endif 

extern "C" NUMBER_API int number(); 

#endif 

number.cppためのコードは次のとおり

#include "number.h" 
extern "C" int number() { return 1; } 

sum.cppためのコードがある:PostgreSQLがインストールされている

extern "C" { 

#include <postgres.h> 
#include <fmgr.h> 
#include <utils/geo_decls.h> 
#include "number.h" 

#ifdef PG_MODULE_MAGIC 
PG_MODULE_MAGIC; 
#endif 

__declspec(dllexport) PG_FUNCTION_INFO_V1(sum); 

Datum sum(PG_FUNCTION_ARGS) 
{ 
    int32 a {number()}; 
    int32 b {number()}; 
    int32 result {a + b}; 
    PG_RETURN_INT32(result); 
} 

} // extern "C" 

SuppossingことC:\Program Files\PostgreSQL\9.5、を作成します

SET PG_DIR=C:\Program Files\PostgreSQL\9.5 
SET PG_INCLUDES=/I%PG_DIR%\include /I%PG_DIR%\include\server /I%PG_DIR%\include\server\port\win32 
CL number.cpp /EHsc /MD /DNUMBER_EXPORTS /LD 
CL sum.cpp /EHsc /MD %PG_INCLUDES% /LD /link number.lib 

は、その後、私はC:\Program Files\PostgreSQL\9.5\libに両方のDLLをコピーして、sum.sqlで関数を作成するためのSQLを記述します:このbuild.batファイル使用して10とsum.dllpsql -U postgres -f sum.sqlを実行した後

CREATE OR REPLACE FUNCTION sum() RETURNS void AS 
'sum' 
LANGUAGE C STRICT; 

は、私は次のエラーを取得します:

psql:sum.sql:3: ERROR: could not load library "C:/Program Files/PostgreSQL/9.5/lib/sum.dll": The specified module could not be found. 

このエラーは、「ファイルが見つかりません」というエラーとは異なります。 PostgreSQLがファイルを検索したようですが、有効なモジュールとして認識しません。しかし、代わりにnum.cppという静的ライブラリを作成し、それをsum.dllとリンクすると、関数が正常に作成されます。言い換えれば、PostgreSQLは必要なすべてのコードが含まれている場合にのみモジュールをロードします。

sum関数を作成すると、どうして私はPostgreSQLにnumber.dllを知らせることができますか?

+0

Dependency Walker(depends.exe)を使って 'lib /'の 'sum.dll'をインプレースで見てみると、啓蒙されているかもしれません。 –

+0

提案していただきありがとうございます。 'sum.dll'で' depends.exe'ツールを試しました。予想通り、 'number.dll'は依存関係として現れますが、' psql'はそれを読み込むことを拒否します。 – eXe

+0

依存関係ウォーカーの依存関係についての苦情はありませんか?私は通常ビジュアルスタジオ経由でmsbuildでPg拡張を構築しました。 http://blog.2ndquadrant.com/compiling-postgresql-extensions-visual-studio-windows/を参照してください。 PostgreSQLはあなたの拡張DLLが必要とする余分なライブラリを気にしません。オペレーティングシステムはそれらをロードする責任があります。 '指定されたモジュールは見つかりませんでした.'は、WindowsのLoadLibrary呼び出しのエラーです。PostgreSQLが内部的に生成したものではありません。あなたの拡張モジュール 'sum.dll' *または' sumで必要とされる他のDLLを参照することができます。dll' *と残念なことにどのような –

答えて

1

PostgreSQLサーバを起動する前に、従属DLLのディレクトリがPATHに存在する必要があります。

移動先:

Control Panel 
System and Security 
    System 
    Advanced System Settings 
    Advanced 
    Environment Variables 
     Path 

は、それを開いて、依存のDLLが存在するすべてのディレクトリのフルパスを追加します。 PostgreSQLサーバを再起動して完了したら、psqlはCモジュールを正常に実行します。

関連する問題