Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mercury 汞“;“未定义引用”;使用本地模块时发生编译错误_Mercury - Fatal编程技术网

Mercury 汞“;“未定义引用”;使用本地模块时发生编译错误

Mercury 汞“;“未定义引用”;使用本地模块时发生编译错误,mercury,Mercury,我有一个导出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

我有一个导出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
/usr/bin/ld:main.o:在函数`'中:
main.c:(.text+0x45):对``的未定义引用
collect2:错误:ld返回了1个退出状态
我正在x86_64-pc-linux-gnu上使用MMC
版本20.06.1

我错过了什么明显的东西吗?代码改进也非常受欢迎。

在“mmc--make int nat.m”之后,您需要运行的命令不是“mmc main.m”, 但是“mmc main.m nat.m”。前者只编译main.m,而后者也编译nat.m。这两种方法都试图从结果生成一个可执行文件 对象文件,但前者将失败,因为“nat”谓词的定义将在它不生成的对象文件中

一般来说,使用自动化系统比手动管理接口文件、对象文件和可执行文件的创建要容易得多 构建系统:可以是mmake脚本,也可以是mmc--make

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

谢谢<代码>mmc--使main
工作正常。