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) を取り除き、スタンドアロンにすることができるかということです。