私は、ネイティブ関数を使って簡単なocaml実行可能ファイルを構築しようとしています。ocamloptは、リンカに渡されるデフォルトの引数をオーバーライドします。
ここにocamlコードminimal.ml
...は、2つのintを取り、intを返す外部関数を定義します。
external add: int -> int -> int = "add";;
Printf.printf "%d\n" (add 4 7);;
そしてここでは、Cコードは、リンカエラーを生成しますが、本当に surpriging方法で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
「Cリンカー」のようなものはありません。 – Olaf
@Olafが修正されました。 OCamlコンパイラのドキュメントには、純粋なocamlプログラムの文脈でのリンクが記載されています。そのような場合、ld/goldは関与していないと思います... ldと金の種類の適切な説明は何ですか? –
"リンカ"について何が間違っていますか? – Olaf