2

C++ ライブラリ (windows、DLL) を構築しており、いくつかの機能のために swi-prolog を組み込みたいと考えています。
私がやっていることは次のとおりです。

#include <Windows.h>
#include <SWI-Prolog.h>

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // DLL モジュールのハンドル
    DWORD fdwReason,     // 関数を呼び出す理由
    LPVOID lpvReserved   // 予約済み
)
{
    BOOL result = TRUE;

    switch(fdwReason)
    {
        case DLL_PROCESS_ATTACH:
        {
            char* av[]{"libswipl.dll"};

            _putenv(R"(SWI_HOME_DIR=C:\Program Files (x86)\swipl\)");

            if(!PL_initialise(1, av))
            {
                result = TRUE;
            }
            else
            {
                PL_halt(1);
                result = FALSE;
            }

            break;
        }

        case DLL_PROCESS_DETACH:
        {
            result = PL_cleanup(1);
            break;
        }
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
            break;
    }

    return result;
}

また、「swipl\lib\libswipl.dll.a」から名前が変更された「libswipl.lib」が含まれます。

まず、dll が見つからないためにエラーが発生するため、問題が解決するまでそれらを実行可能フォルダーにコピーしました (具体的には、libswipl.dll;libgmp-10.dll;pthreadGC2.dll)。

実行可能ファイルに pl ファイルを含める必要はありません (これは swipl-ld の機能ですか?) 後でコードによって事実とルールを動的に追加したいので、クリア状態で初期化しても問題ありません。

私が知りたいのは、どうすれば依存関係 (SWI_HOME_DIR) を取り除き、スタンドアロンにすることができるかということです。

4

2 に答える 2

0

SWI-Prolog を使ったことがないのですが、インストールされているファイルを見ると、そこにインストールされているファイルのいくつかは、Prolog エンジンを実行するために必要なようです。

すべてを dll に組み込みたいという場合は、おそらく不可能であり、唯一の方法は swi-prolog 自体を変更することです。しかし、それは簡単ではありません。

プログラムを実行するためにswi-prologをインストールする必要がない場合。swi-prolog を実行するすべてのファイルを含む独自のインストーラーを作成し、それを独自の (サブ) ディレクトリに含めることができます。SWI_HOME_DIR を設定する必要がありますが、実行可能ファイルの相対ディレクトリがわかります。

_putenv を使用して SWI_HOME_DIR を設定したくない場合は、Windows システム設定で SWI_HOME_DIR を正しい値に設定することもできます。

于 2012-12-09T20:57:11.430 に答える