我正在尝试使用本机函数构建一个简单的ocaml可执行文件。
这是ocaml代码minimal.ml
...它定义了一个外部函数,它接受两个int并返回一个int。
external add: int -> int -> int = "add";;
Printf.printf "%d\n" (add 4 7);;
这是c代码minimal.c
#define CAML_NAME_SPACE
#include <caml/mlvalues.h>
CAMLprim value
add(value x, value y)
{
int x1;
int y1;
int z;
x1 = Int_val(x);
y1 = Int_val(y);
z = x1 + y1;
return Val_int(z);
}
ocamlopt minimal.ml minimal.c
生成链接器错误,但确实存在
横行方式。它抱怨似乎是OCaml本机运行时的一部分,而不是抱怨_add
。
如何告诉ocamlopt
向链接器提供哪些参数?
$ ocamlopt minimal.ml minimal.c
Undefined symbols for architecture x86_64:
"_camlMinimal", referenced from:
_caml_globals in camlstartupf80fc9.o
"_camlMinimal__code_begin", referenced from:
_caml_code_segments in camlstartupf80fc9.o
"_camlMinimal__code_end", referenced from:
_caml_code_segments in camlstartupf80fc9.o
"_camlMinimal__data_begin", referenced from:
_caml_data_segments in camlstartupf80fc9.o
"_camlMinimal__data_end", referenced from:
_caml_data_segments in camlstartupf80fc9.o
"_camlMinimal__entry", referenced from:
.L115 in camlstartupf80fc9.o
"_camlMinimal__frametable", referenced from:
_caml_frametable in camlstartupf80fc9.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
File "caml_startup", line 1:
Error: Error during linking
Exit 2
答案 0 :(得分:2)
您的问题是minimal.c和minimal.ml都创建了一个名为minimal.o的文件。解决此问题的一个方法是将minimal.c重命名为add.c。
$ mv minimal.c add.c
$ ocamlopt -o minimal add.c minimal.ml
$ ./minimal
11
<强>更新强>
ocamlopt创建2个或3个目标文件。如果编译没有单独接口(.mli)文件的.ml文件,则会创建.cmi(已编译的接口),. o(本机代码)和.cmx(额外的OCaml元数据)。
$ ls -1
add.c
minimal.ml
$ ocamlopt -c minimal.ml
$ ls -1
add.c
minimal.cmi
minimal.cmx
minimal.ml
minimal.o