2016-02-03 12 views
6

Ich schreibe ein Programm in Crystal, das ich kompilieren und auf andere Systeme zur Ausführung verschieben möchte. Idealerweise sollte es keine Abhängigkeiten haben, da die Zielsysteme Linux-Neuinstallationen sein werden.Wie kann ich eine ausführbare Crystal-Datei ohne Abhängigkeiten erstellen?

Leider kann ich die libc-Abhängigkeit nicht umgehen, deshalb werde ich vermutlich die ausführbare Datei auf einem System kompilieren müssen, das die niedrigste Version von libc besitzt, auf die ich zielen möchte. Ich denke, es sollte vorwärtskompatibel sein.

Ich habe jedoch Schwierigkeiten mit libssl. Standardinstallation von Debian Wheezy scheinen nicht mit libssl zu kommen, so dass ich diese Fehlermeldung erhalten, wenn meine ausführbaren Datei ausgeführt wird:

error while loading shared libraries: libssl.so.1.0.0: 
cannot open shared object file: No such file or directory 

Ich gehe davon aus dieser Abhängigkeit besteht, weil ich require "http/client" in meiner Quelle. Allerdings mache ich keine SSL-bezogene Anrufe, da ich sie nur für ungesicherte Webseiten verwende.

Ich habe anscheinend auch eine Abhängigkeit von libevent-2.0.so.5. Vermutlich alle Crystal-Programme. Wer weiß, wie viele andere Abhängigkeiten Crystal hat?

Meine ausführbaren Dateien müssen auf einem frisch installierten Linux-System laufen. Wie kann ich eine ausführbare Crystal-Datei ohne Abhängigkeiten erstellen? Anders als libc, nehme ich an.

+0

Ich mag diese Frage; Zu einer Zeit war alles statisch verbunden. Der Wurm dreht sich. – will

Antwort

7

In Linux können Sie die freigegebenen Bibliotheken, die eine ausführbare Datei benötigt, mit dem Befehl ldd auflisten. In OSX könnte otool -L für den gleichen Zweck verwendet werden.

Normalerweise verwendet der Linker beim Erstellen der ausführbaren Datei gemeinsam genutzte Bibliotheken, wenn er sie finden kann. Was Sie also tun müssen, ist, den Linker zu zwingen, stattdessen statische Bibliotheken zu verwenden. (In Zukunft könnten wir dem Compiler eine Markierung hinzufügen, um diese Wahl zu erzwingen)

Sie sollten einige dieser statischen Bibliotheken in/opt/crystal/embedded/lib finden. Wir verwenden diese, um einen tragbaren Crystal Compiler zu generieren.

Um diese Bibliotheken zu verwenden, können Sie ausführen:

$ LIBRARY_PATH=/opt/crystal/embedded/lib crystal build my_app.cr 

, die verfügbare Bibliotheken in diesem Verzeichnis bevorzugen sollte vor anderen installierten in den Standard-Standorten berücksichtigen.

Leider ist OpenSSL nicht mit Crystal verteilt, Sie müssen also entweder eine statische Version von libssl und kopieren oder erstellen. Es ist sowieso eine gemeinsame Bibliothek, die in jeder Linux-Distribution verfügbar ist.

In Bezug auf libc, das ist schwieriger. Wir kompilieren das Crystal-Binary für Releases mit alten CentOS- und Debian-Distributionen, um es mit vielen weiteren libc-Versionen kompatibel zu machen.

+1

Super, danke. Ich hatte Erfolg mit 'crystal build FILE.cr --cross-compile" Linux x86_64 "--target" x86_64-unknown-linux-gnu "' und 'cc FILE.o -o FILE-Wl, -Bstatic -levent -lpcre -lssl -lgc -lcrypto -lz -Wl, -Bdynamic -ldl -lrt -lpthread -lc', aber Ihr Weg ist viel einfacher. Ich habe 'apt-file' benutzt, um die' .a' Dateien zu finden, und habe sie dann in das crystal lib Verzeichnis verlinkt. –

+0

Funktioniert eine kompilierte 32-Bit-kompilierte ausführbare Datei korrekt in 64-Bit-Linux? –

+0

'objdump' ist übrigens auch nützlich, um die Abhängigkeiten der dynamischen Bibliothek aufzulisten. –

Verwandte Themen