Einbetten von OCaml in C: Verknüpfungsfehler

8

Ich versuche, ein Programm zu kompilieren, das gemischte C- und Ocaml-Quellen verwendet, wobei die Hauptanwendung in C einige OCaml-Code-Teile aufruft. Alles klar, kein Problem hier, es scheint eine übliche Operation zu sein, vollständig dokumentiert , einfach mit den Ocaml-Standardwerkzeugen zu machen.

Lassen Sie mich etwas erklären, diese Art der Kompilierung ist in 4 Schritte unterteilt: Caml kompiliert zu Caml Objekten, dann kompiliert man die Caml zu C Objekten, kompiliert dann die C Dateien und schließlich compiliert alle C Objekte zusammen und bekommt die ausführbar.

Die Theorie ist, dass der Ocaml-Compiler die Caml-Runtime, GC und all seine Sachen automatisch einbetten wird, und wir müssen nur angeben, ob wir den ocaml-Bytecode (Referenzierung -lcamlrun ) oder die native Binärdatei (Referenzierung%) verwenden. co_de%).

Es scheint also ziemlich einfach zu sein, lass es uns tun. Die Schritte 1, 2 und 3 verliefen wie erwartet, gut! Nur der 4. Schritt ist problematisch. Sieh es dir einfach an:

%Vor%

IMHO scheint es, dass es zwei Fehler gibt:

  • Mehrere Definitionen von -lasmrun
  • Der Linker findet das Modul main nicht

Ich habe wirklich keine Ahnung, wie ich das beheben kann, vielleicht muss ich eine andere Datei verknüpfen. Hat jemand eine Idee?

Wie gesagt, habe ich den Code eingegeben, der diese Fehler verursacht. Es wird ziemlich einfach sein, weil es sehr wenig Code gibt, der meiste davon wurde in einem Beispiel in der Dokumentation gegeben.

Pervasive

%Vor%

init.ml

%Vor%

caml_func.c

%Vor%

Und das ist alles. Offensichtlich habe ich alle bedeutungslosen Dinge übersprungen, da dieses einfache Beispiel funktionieren sollte und nicht. Es muss mein interface.c sein, was folgt.

Übrigens, es ist ziemlich hässlich. Wenn Sie Vorschläge für diese Art von Anwendung (Caml in C) oder Refactoring-Vorschläge haben, nehme ich sie alle.

Makefile

%Vor%     
Thomas Wickham 20.04.2012, 10:40
quelle

1 Antwort

6

Ihr Linkbefehl ist auf zwei Arten falsch:

  1. Sie müssen eine Verknüpfung mit -ldl für dlopen usw. herstellen.
  2. Sie müssen Bibliotheken nach Objekten einfügen, die auf sie verweisen (d. h. Ihre -lcamlrun Argumente sind an der falschen Stelle in der Verbindungslinie). Die Reihenfolge der Argumente in der Link-Zeile zählt .
Employed Russian 20.04.2012, 19:18
quelle

Tags und Links