2017-09-18 5 views
-1

私は、ネイティブ関数を使って簡単な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 
+0

「Cリンカー」のようなものはありません。 – Olaf

+0

@Olafが修正されました。 OCamlコンパイラのドキュメントには、純粋なocamlプログラムの文脈でのリンクが記載されています。そのような場合、ld/goldは関与していないと思います... ldと金の種類の適切な説明は何ですか? –

+0

"リンカ"について何が間違っていますか? – Olaf

答えて

2

minimal.cとminimal.mlの両方がminimal.oという名前のファイルを作成するという問題があります。 1つは、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 
+0

'minimal.cmo'ではなく' minimal.ml'に対して 'ocamlopt'が' minimal.o'を作成しているのはなぜですか? –

+0

実際には常に.oと.cmxの両方が作成されます。 .oファイルにはネイティブコードがあります。 .cmxファイルには余分なOCamlメタデータがあります。 .cmoファイルは、バイトコードコンパイラによって作成されます。 –

関連する問題