원시 함수로 간단한 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
"C 링커"와 같은 것은 없습니다. – Olaf
@Olaf가 수정되었습니다. OCaml 컴파일러 문서는 pure-ocaml 프로그램의 맥락에서 링크를 언급하고 있는데, 나는 ld/gold가 관련이 없다고 생각합니다. ld와 gold의 유형에 대한 적절한 설명은 무엇입니까? –
"링커"의 문제점은 무엇입니까? – Olaf