2017-09-18 10 views
-1

J'essaie de créer un exécutable ocaml simple avec une fonction native.ocamlopt redéfinir les arguments par défaut passés à l'éditeur de liens

Voici le code ocaml minimal.ml ... il définit une fonction externe qui prend deux ints et retourne un int.

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

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

Et voici le code 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 génère des erreurs de l'éditeur de liens, mais d'une manière vraiment surpriging. Il se plaint des symboles qui semblent faire partie de l'environnement d'exécution natif OCaml, et ne se plaint pas de _add.

Comment indiquer ocamlopt les arguments à fournir à l'éditeur de liens?

$ 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

Il n'y a rien comme un "C linker". – Olaf

+0

@Olaf fixé. La documentation du compilateur OCaml mentionne la liaison dans le contexte des programmes pure-ocaml et dans ces cas je pense que ld/gold ne sont pas impliqués ... Quelle est la description correcte du type de chose que ld et gold sont? –

+0

Qu'est-ce qui ne va pas avec "linker"? – Olaf

Répondre

2

Votre problème est que minimal.c et minimal.ml créent un fichier nommé minimal.o. Une solution à ce problème consiste à renommer minimal.c en add.c.

$ mv minimal.c add.c 
$ ocamlopt -o minimal add.c minimal.ml 
$ ./minimal 
11 

Mise à jour

ocamlopt crée 2 ou 3 fichiers objets. Si vous compilez un fichier .ml sans fichier d'interface séparé (.mli), il crée .cmi (l'interface compilée), .o (le code natif) et .cmx (les métadonnées OCaml supplémentaires).

$ ls -1 
add.c 
minimal.ml 
$ ocamlopt -c minimal.ml 
$ ls -1 
add.c 
minimal.cmi 
minimal.cmx 
minimal.ml 
minimal.o 
+0

Pourquoi 'ocamlopt' crée-t-il un' minimal.o' pour 'minimal.ml' au lieu d'un' minimal.cmo'? –

+0

En fait, il crée toujours à la fois .o et .cmx. Le fichier .o a le code natif. Le fichier .cmx contient les métadonnées OCaml supplémentaires. Les fichiers .cmo sont créés par le compilateur bytecode. –