【问题标题】:Mercury "undefined reference" compilation error when using local module使用本地模块时出现 Mercury“未定义引用”编译错误
【发布时间】:2021-06-30 20:11:07
【问题描述】:

我有一个模块导出 nat/1 以测试/生成自然数:

:- module nat.

:- interface.

:- import_module int.

:- pred nat(int).
:- mode nat(in) is det.
:- mode nat(out) is multi.

:- implementation.

:- pragma promise_pure(nat/1).
nat(_::in).
nat(0::out).
nat(X::out) :- nat(Y), X = Y + 1.

和一个主模块在同一个目录下试试看:

:- module main.

:- interface.
:- import_module io.

:- pred main(io__state::di, io__state::uo) is cc_multi.

:- implementation.
:- import_module nat.

main(!IO) :- nat(X), print(X, !IO).

我运行mmc --make-int nat.m 成功生成了接口文件,但是当我运行mmc main.m 时出现以下错误:

/usr/bin/ld: main.o: in function `<predicate 'main'/2 mode 0>':
main.c:(.text+0x45): undefined reference to `<predicate 'nat.nat'/1 mode 1>'
collect2: error: ld returned 1 exit status

我正在使用 MMC version 20.06.1, on x86_64-pc-linux-gnu

我是否遗漏了一些明显的东西?代码改进也非常受欢迎。

【问题讨论】:

    标签: mercury


    【解决方案1】:

    “mmc --make-int nat.m”之后,需要运行的命令不是“mmc main.m”, 但是“mmc main.m nat.m”。前者编译only main.m,而后者也编译nat.m。两者都尝试从结果构建可执行文件 目标文件,但前者会失败,因为“nat”谓词的定义将在它不生成的目标文件中。

    一般来说,与其尝试手动管理接口文件、目标文件和可执行文件的创建,不如使用自动化的 构建系统:mmake 脚本或 mmc --make。

    至于代码改进,我建议用简单的 io 替换 io__state,这要短得多。我们添加了“io”作为“状态”的同义词 专门输入 io.m 以使这成为可能。

    【讨论】:

    • 谢谢! mmc --make main 效果很好。
    猜你喜欢
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多