私は、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.dll
psql -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
を知らせることができますか?
Dependency Walker(depends.exe)を使って 'lib /'の 'sum.dll'をインプレースで見てみると、啓蒙されているかもしれません。 –
提案していただきありがとうございます。 'sum.dll'で' depends.exe'ツールを試しました。予想通り、 'number.dll'は依存関係として現れますが、' psql'はそれを読み込むことを拒否します。 – eXe
依存関係ウォーカーの依存関係についての苦情はありませんか?私は通常ビジュアルスタジオ経由でmsbuildでPg拡張を構築しました。 http://blog.2ndquadrant.com/compiling-postgresql-extensions-visual-studio-windows/を参照してください。 PostgreSQLはあなたの拡張DLLが必要とする余分なライブラリを気にしません。オペレーティングシステムはそれらをロードする責任があります。 '指定されたモジュールは見つかりませんでした.'は、WindowsのLoadLibrary呼び出しのエラーです。PostgreSQLが内部的に生成したものではありません。あなたの拡張モジュール 'sum.dll' *または' sumで必要とされる他のDLLを参照することができます。dll' *と残念なことにどのような –