在 dll 中嵌入 prolog 引擎

2024-03-23

我最近一直在开发一个嵌入 prolog 推理引擎的 C++ 应用程序,正如标题中所述,我现在尝试生成一个 DLL 而不是可执行文件,以便我可以在另一个项目中使用它。由于我是 DLL 开发的新手,我想我可以从一个小例子开始。我有3个文件:

  • likes.pl:定义谓词 likes/2 的示例 prolog 文件
  • likes.cpp:定义函数get_food()那个叫PlQuery并返回结果std::string
  • food.cpp:使用DLL列出Sam喜欢的各种食物

所以我的第一次尝试如下:

swipl-ld -shared -dll -o likes -goal true likes.cpp likes.pl -DLIKES_EXPORTS -v
g++ -o food.exe -s food.cpp -L. -llikes -I. -L"c:/program files (x86)/swipl/lib" -lswipl -I"c:/program files (x86)/swipl/include"

首先,我要指出的是,当get_food()只返回一个字符串,而不调用任何序言,这工作正常。然而,经过两天的调查,我无法弄清楚如何让DLL调用prolog。我认为我可能做错了两件事,也许两者都做错了:PlEngine 初始化和保存的状态。

我尝试过在中调用 PlEngineget_food() and in food.cpp main()函数,结果相同。所以现在我坚持第一个选项,因为我对在 DLL 中完成所有事情更感兴趣。我看到这里(将 SWI-Prolog 嵌入 dll 中 https://stackoverflow.com/questions/13785922/embedding-swi-prolog-in-a-dll),稍后可以在DllMain但也不建议这样做。最好的方法是什么?我应该给 food.exe 作为argv[0]或者其他东西(libswipl.dll?保存的状态?)

其次,我注意到使用 swipl-ld 生成 DLL 而不是 EXE 时的一个区别是它省略了以下行:

swipl.exe -f none -F none -g true -t"consult(['likes.pl']),qsave_program('pltmp-4228.exe',[goal=true,toplevel=prolog,init_file=none])"
cat pltmp-4228.exe >> food.exe

所以我尝试手动执行此操作,将随机名称替换为“mystate.exe”并使用Win32copy /b命令将其附加到 food.exe。这使得 food.exe 成为我可以测试的顶级控制台likes/2。是不是因为Dll没有main()?不管怎样,这是我目前能达到的最远的目标,我想在这个过程中还有一些事情需要改变。qsave_program/2第二个论点。我尝试更换toplevel=prolog with stand_alone=true。顺便说一下,( 末尾给出的命令示例http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%272.10%27,swi%28%27/doc/Manual/compilation.html%27%29%29 http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%272.10%27,swi%28%27/doc/Manual/compilation.html%27%29%29)根本不生成任何文件。不管怎样,我也不知道我是否必须这样做以及到底如何这样做。

谁能告诉我如何解决这个问题?


请原谅我,因为这并不是对您问题的准确答案,只是关于我在该主题上的经验的报告。

我一直在努力pq控制台 https://github.com/CapelliC/pqConsole,一个通过 C++ 接口引入 Qt 绑定的 DLL。

pqConsole 虽然仍在开发中,但迄今为止已在以下领域找到了自己的出路:滑动双赢 http://www.swi-prolog.org/git/packages/swipl-win.git,我很高兴能与 Jan Wielemaker 合作,为扩大 Prolog 受众迈出了这一小小的大步。

我建议使用 G++ 构建 DLL,以获得二进制兼容性,并按原样发布 SWI-Prolog 组件。

如果你喜欢Qt,你可以使用QtCreator进行界面设计,例如fdqueens https://github.com/CapelliC/fdqueens。 在那里你还可以看到我如何在 Qt 项目中嵌入 .pl资源,对应用程序有更多的控制(用户不能弄乱 Prolog 逻辑)required来自其他部分)以及整个发行版(无需添加 .pl,只需添加可执行文件/DLL)。

HTH

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 dll 中嵌入 prolog 引擎 的相关文章

随机推荐

  • 将数据帧转换为向量(按行)

    我有一个包含像这样的数字条目的数据框 test lt data frame x c 26 21 20 y c 34 29 28 我怎样才能得到下面的向量 gt 26 34 21 29 20 28 我能够使用以下方法获得它 但我想应该有一种更
  • 微服务中的服务器到服务器通信

    我正在研究微服务架构 但我在这方面面临一些挑战 首先让我向您简要介绍一下架构 用户登录并获取签名令牌 该令牌将用于调用所有 REST API 将会有很多 API 服务器 其中 API 使用 Spring 安全性进行保护 并根据用户角色进行授
  • 奇数或偶数反斜杠和转义字符

    我对下面的代码有一点问题 import re pattern re compile r for text in r ok py r ok py r ok py r ok py r ok py search re search pattern
  • ReactJs“不变违规...”经典反应问题

    这是一个典型的反应问题 但我有点不知道如何处理它 我只想动态渲染我的表格线 但我收到错误 未捕获错误 不变违规 processUpdates 无法找到元素的子元素 2 这可能意味着 DOM 意外变异 例如 通过浏览器 通常是由于在使用表 嵌
  • 如何以简单的方式将 CGPoint 对象添加到 NSArray 中?

    我有大约 50 个 CGPoint 对象 它们描述了类似 路径 的东西 我想将它们添加到 NSArray 中 这将是一个只返回给定索引对应的 CGPoint 的方法 我不想创建 50 个变量 例如 p1 p2 依此类推 有没有一种简单的方法
  • 在 Windows Phone 8 中存储配置值/设置的最佳方法

    由于 WP8 应用程序中没有默认配置文件 因此存储配置值的最佳方式是什么 例如WCF 服务 URL 用户名和密码 我希望当手机重新启动且应用程序关闭时这些值可用且可更新 提前致谢 你应该使用IsolatedStorageSettings A
  • 如何在 Swift 中的自定义类中初始化 Timer? [复制]

    这个问题在这里已经有答案了 我制作了一个简单的计时器应用程序 但是 现在我想让它变得更好 并且我想为计时器控件编写一个类 class Cronometer private var counter Int 0 private var time
  • https://graph.microsoft.com/v1.0/places/microsoft.graph.room Api 未提供更新的数据

    我正在使用 Microsoft Graph 获取可供租户使用的房间列表 根据文档 列出 Palace Api 应该用于此目的 现在 我在使用 List Places api 获取更新数据时遇到问题 我已向租户添加了一些房间 但这些房间并未反
  • 使用 LINQ 时谓词的顺序重要吗?

    我知道以不同的顺序执行操作会产生不同的性能 例如以下慢速查询之间的差异 List
  • 无法在电子js中加载反应

    这是我的 package js 文件 name cabed version 0 1 0 private false dependencies testing library jest dom 5 16 5 testing library r
  • 经典 ASP 错误行 0 列 -1

    我们运行一个基于经典 ASP 构建的繁忙网站 出于各种遗留原因 在繁忙期间 我们会看到无法解释的错误 但无法追根究底 它通过 IIS 7 触发我们的自定义 500 错误页面来体现 在此页面上 我们使用 ASPError 对象和 err 对象
  • 如何用点更改 ggplot2 箱线图颜色

    解决了抖动问题 https stackoverflow com questions 52506296 ggplot geom point position jitterdodge not working when color specifi
  • 如何在宽度可变的 div 中居中/对齐 Google 地图

    我在 div 中加载了 Google 地图 其宽度为页面的 100 通过 API 叠加层位于中心 地图应如下所示放置 问题是地图现在左对齐 我可以使用与页面宽度相对应的 LatLng 移动中心 但这对于一个简单的任务来说似乎需要大量工作 我
  • C# 为 Azure Function v3 全局设置大小写约定

    我是 Azure Functions 的新手 正在尝试将 NET Core API 转换为 Azure Functions 我面临的问题是如何全局设置响应命名约定 JSON 默认情况下 它是CamelCase但我想用PascalCase 我
  • 如何从 git 上的 filter-branch 命令中删除重复的提交?

    我有一个 Django 项目 我已经将其保密很长一段时间了 在我参与的项目的整个生命周期中settings py base settings py and secret settings py包含敏感信息的文件 现在我决定将代码开源 因为我
  • React Native - TextInput 的 onChange 与 onChangeText 之间的区别

    我不确定什么时候使用onChange vs onChangeText in a TextInput成分 我知道onChangeText接受更改后的文本作为回调中的参数 但这就是您要使用的原因onChangeText 因为您可以在回调中更新状
  • Array_merge 与 + [重复]

    这个问题在这里已经有答案了 当我使用array merge 使用关联数组我得到了我想要的 但是当我将它们与数字键数组一起使用时 键会发生变化 With 键被保留 但它不适用于关联数组 我不明白这是如何工作的 有人能给我解释一下吗 由于两个数
  • FabricJs - 通过 SVG 对象剪切区域

    我对 FabricJS 对象有疑问 我想创建一个剪切区域 svg 对象 它将剪切加载的图像 我在加载的图像上使用 ClipTo 方法 将其传递到剪切区域形状对象 SVG 中 但它不起作用 因为 SVG 不是 FabricJS 意义上的形状对
  • 设置 java URLConnection 的用户代理

    我正在尝试使用 Java 和 URLConnection 来解析网页 我尝试像这样设置用户代理 java net URLConnection c url openConnection c setRequestProperty User Ag
  • 在 dll 中嵌入 prolog 引擎

    我最近一直在开发一个嵌入 prolog 推理引擎的 C 应用程序 正如标题中所述 我现在尝试生成一个 DLL 而不是可执行文件 以便我可以在另一个项目中使用它 由于我是 DLL 开发的新手 我想我可以从一个小例子开始 我有3个文件 like