c++ - 在 dll 中嵌入 SWI-Prolog

标签 c++ dll prolog swi-prolog

我正在构建一个 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;
}

包括“libswipl.lib”,从“swipl\lib\libswipl.dll.a”重命名。

首先它会因为缺少 dll 而出错,所以我将它们复制到我的可执行文件夹中直到它满意为止(特别是 libswipl.dll;libgmp-10.dll;pthreadGC2.dll)。

我不需要将 pl 文件包含到可执行文件中(这是 swipl-ld 的作用吗?)因为我想稍后通过代码动态地添加事实和规则,因此可以使用清晰的状态进行初始化。

我想知道的是,如何摆脱依赖项 (SWI_HOME_DIR) 并使其独立?

最佳答案

首先我不建议在 DllMain 中初始化 prolog,请看这里:

但是,您仍然可以使用它并检查依赖库是否存在,而不仅仅是 libswipl.dll 它从 5.10 版本更改为 swipl.dll ,还有:

  • 64 位的 pthreadVC2.dll 或 32 位的 pthreadVC.dll
  • plterm.dll(可选,终端仿真)

然后,我会添加并导出一个函数来初始化 prolog,并设置所需的参数(例如:保存状态文件名或 boot32.prc/boot64.prc、flags 和 tc)。

而且,当您将所有必需的参数传递给 PL_initialise 函数时,您不需要SWI_HOME_DIR

此外,在多线程环境中,需要调用这些函数:PL_thread_attach_enginePL_thread_destroy_engine

有关该主题的更多信息,请参见:swi-prolog

干杯!

关于c++ - 在 dll 中嵌入 SWI-Prolog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13785922/

相关文章:

c++ - 关于模板和函数的 auto 用法

c++ - 我是否需要在显式加载的共享库之间隐式链接以进行交互?

delphi - 如何从DLL导出重载函数?

c# - 将 *.exe 嵌入到 dll 中

list - Prolog:在列表中,查找给定元素之后的元素

c++ - Hu 矩和 SVM 不起作用

c++ - 您应该通过 std::function 还是通过通用引用将可调用对象作为接收器参数传递?

c++ - 使用 boost::asio::streambuf 作为 istream 和数组作为 string_view 是否安全?

object - 扩展模块谓词的 Prolog 设计模式

prolog - 如何阅读prolog中的谓词