ocamlopt覆盖传递给链接器的默认参数

时间:2017-09-18 23:14:18

标签: ocaml

我正在尝试使用本机函数构建一个简单的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

1 个答案:

答案 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