2017-09-18 6 views
-1

원시 함수로 간단한 ocaml 실행 파일을 빌드하려고합니다.ocamlopt는 링커에 전달 된 기본 인수를 대체합니다.

다음은 ocaml 코드 minimal.ml입니다. 두 개의 int를 사용하고 int를 반환하는 외부 함수를 정의합니다. 여기

external add: int -> int -> int = "add";; 

Printf.printf "%d\n" (add 4 7);; 

그리고

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이 링커 오류가 발생하지만, 정말 surpriging 방법으로 C 코드를합니다. _add에 대해 불평하지 않고 OCaml 네이티브 런타임의 일부로 보이는 심볼에 대해 불평하고 있습니다.

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 컴파일러 문서는 pure-ocaml 프로그램의 맥락에서 링크를 언급하고 있는데, 나는 ld/gold가 관련이 없다고 생각합니다. ld와 gold의 유형에 대한 적절한 설명은 무엇입니까? –

+0

"링커"의 문제점은 무엇입니까? – Olaf

답변

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 
+0

왜'minimal.cmo '대신에'minimal.ml'을위한'minimal.o'를'ocamlopt'가 만드나요? –

+0

실제로 항상 .o와 .cmx가 생성됩니다. .o 파일에는 원시 코드가 있습니다. .cmx 파일에는 추가 OCaml 메타 데이터가 있습니다. .cmo 파일은 바이트 코드 컴파일러에 의해 만들어집니다. –