2010-11-12 2 views
6

Ich habe ein großes OCaml-Projekt, das ich mit ocamlbuild kompiliere. Alles funktioniert gut, ich habe eine großartige ausführbare Datei, die alles so macht, wie ich will. Das Problem ist, dass, wenn ich diese native ausführbare Datei "my_prog.native" nehme und sie woanders abspiele (andere Maschine mit demselben Betriebssystem, etc.), die neue Maschine beschwert, dass sie Kamille (die in einem Batteries verwendet wird) nicht finden kann Bibliothek, die ich benutze). Ich dachte, die ausführbare Datei, die wir von ocamlbuild erhalten haben, war eigenständig und es war nicht erforderlich, dass OCaml oder Kamille in der Maschine, in der wir sie ausgeführt haben, präsent war, aber das scheint nicht der Fall zu sein.Kann ich native ausführbare Dateien mit OCamlBuild erstellen, die auf Computern ausgeführt werden können, die keine OCaml-Bibliotheken haben?

Haben Sie Ideen, wie Sie wirklich eigenständige Executables erstellen können?

Antwort

3

Soweit ich weiß, wird Camomile zur Laufzeit dynamisch geladen, daher ist es am einfachsten, die DLL/das gemeinsam genutzte Objekt zusammen mit der ausführbaren Datei bereitzustellen.

Sie könnten versuchen, eine statische Verbindung zu erzwingen, aber dies würde Ihre Anwendung mit der LGPL-Lizenz verunreinigen.

+0

Danke für die Antwort. Woher weiß ich, welche .so muss ich zusammen mit meiner ausführbaren Datei bereitstellen? Wenn ich die statische Verknüpfung verwende, wie erzwinge ich eine statische Verbindung? Vielen Dank! – Surikator

+2

Es ist nicht die Kamille-Bibliothek, die dynamisch geladen wird, sondern eine Reihe von Datendateien, die Unicode-Zuordnungen für verschiedene Zeichenzuordnungen enthalten. – Thelema

7

Die meisten OCaml-Codes sind statisch verknüpft. Es gibt zwei Dinge, die dynamisch verknüpft sind:

  • C Stub-Bibliotheken bei der Verwendung von Bytecode (und möglicherweise nativen Code, obwohl ich nicht denke, dass dies der Fall ist). Diese sind dllfoo.so, entsprechend libfoo.a. Wenn Sie ein libfoo.a haben, denke ich, dass es das anstelle von dllfoo.so für systemeigenen Code verwenden wird.
  • Dynamische Bibliotheken, die von den Runtime- oder Stub-Bibliotheken abhängen (z. B. libc oder libgtk, die von lablgtk usw. verwendet werden).
  • Außerdem lädt Camomile dynamisch einige seiner Unicode-Daten, was ein Sonderfall ist, der nicht in die Standard-OCaml-Verknüpfung fällt. Sie müssen die Kamille-Dokumentation konsultieren, um eine Möglichkeit zu finden, diese Daten statisch einzubetten.

    Verwandte Themen