Wie verteile ich meine wissenschaftliche Software mit möglichst wenigen Abhängigkeiten?

8

Im Rahmen meiner Recherchen schreibe ich viel Python- und MATLAB-Code, der niemals an andere verteilt werden muss. Selbst wenn ich meine Software verteilen muss, machen Python und MATLAB, die beide interpretiert werden, das Teilen relativ einfach.

Jetzt schreibe ich eine Software in C ++, die ich verteilen möchte. Ich habe einen Überblick darüber, wie die Software auf meinem eigenen Computer kompiliert wird, aber ich habe kein Verständnis dafür, was getan werden muss, um anderen Menschen die Software zu geben.

Zunächst mehr zu meinem Projekt: Ich schreibe Code, um Visualisierungen zu berechnen und anzuzeigen. Das Projekt basiert auf Grafiken, daher verwende ich die LEMON-Grafikbibliothek. Ich untersuche VTK- und OpenGL-Implementierungen, um die Visualisierung anzuzeigen. Ich möchte Python- und MATLAB-Bindungen für Benutzer dieser Umgebungen schreiben, um meine Software verwenden zu können, und ich möchte Windows- und Linux-Versionen erstellen (ich habe noch nicht an OS X gedacht ...).

Nehmen wir als Beispiel die LEMON-Diagrammbibliothek. Es ist eine Reihe von Headern zusammen mit einem kleinen gemeinsamen Objekt. Auf meinem Entwicklungssystem kompiliere ich die Bibliothek mit CMake und verknüpfe sie mit meinem Projekt.

Angenommen, ich möchte meine Software jemandem geben, der unter Windows ausgeführt wird. Ich möchte, dass sie ein Installationsprogramm herunterladen, auf ein oder zwei Schaltflächen klicken und sich um alles kümmern können. Ich möchte nicht, dass sie sich Gedanken über die Installation der LEMON-Bibliothek oder von OpenGL machen. Sie sollten nichts wissentlich zusammenstellen müssen. Ist das möglich?

Ich habe das Gefühl, dass es so ist, aber ich komme zu kurz, wenn ich nach Referenzen suche. Ich habe eine vage Vorstellung davon, dass ich, wenn ich eine Binärdatei unter Windows kompiliere, diese Binärdatei an jeden verteilen kann, der ein Windows-Betriebssystem ausführt. Aber was ist mit den Bibliotheken, die ich benutze? Ich schätze, ich muss sie unter Windows statisch verknüpfen, und das wird das dortige Abhängigkeitsproblem beheben. Aber im Hinterkopf habe ich gelesen, dass statisches Verknüpfen keine gute Praxis ist (oder ist dies nur unter Linux?)

Wie Sie sehen, bin ich etwas verloren. Ich würde mich über einen Anstoß in die richtige Richtung und einige Hinweise freuen, die Sie lesen sollten, wenn Sie etwas wissen!

jme
quelle
5
Ich habe einen Rat für Sie: Beginnen Sie mit dem VERSUCHEN. Kompilieren Sie tatsächlich ein Paket, gehen Sie zu einem anderen Computer und versuchen Sie, es dort auszuführen (verwenden Sie Installationsprogramme erst, nachdem Sie wissen, was zu tun ist). Spülen, wiederholen. Erkunden Sie die Compilereinstellungen, vermeiden Sie die Verwendung von Debug-Bibliotheken für die Veröffentlichung und verwenden Sie die Abhängigkeitsverfolgung.
Deer Hunter
@DeerHunter Ich kann den empirischen Ansatz schätzen und habe sicherlich ein paar Stunden damit verbracht, zu experimentieren und zu suchen. Trotzdem möchte ich wissen, ob es überhaupt möglich ist, beispielsweise VTK mit meiner Software zu verpacken, damit der Benutzer sie oder eine ihrer Abhängigkeiten nicht installieren muss. Jedes Projekt, das ich gesehen habe und das VTK verwendet, fordert den Benutzer auf, es als Voraussetzung zu installieren. Vielleicht ist das meine Antwort.
jme
jme, es ist möglich, wenn Sie die Lizenz überprüfen und die Lizenz dies zulässt. Gebündelte Abhängigkeiten werden in allen wichtigen Installer-Frameworks unterstützt.
Deer Hunter
1
Unter Linux wird die dynamische Verknüpfung bevorzugt, da die Paketverwaltungssoftware sicherstellt, dass nur eine Kopie jeder Bibliothek im System vorhanden ist. Aber unter Windows einfach statisch verknüpfen, da es nicht viel von einem verwendbaren Paketmanager hat. Selbst unter Linux würde ich statisch Dinge verknüpfen, die sich nicht im Standardpaket-Repository oder in LSB befinden, um die Cross-Distribution-Kompatibilität zu gewährleisten. Stellen Sie einfach sicher, dass Sie dazu berechtigt sind (LGPL stoppt an der dynamischen Verbindungsgrenze, sodass Sie möglicherweise keine statische Verknüpfung herstellen, z. B. Qt in Nicht-LGPL-Anwendungen).
Jan Hudec
1
@ JanHudec unter Windows können Sie auch einfach dynamisch verknüpfen und alle verwendeten DLLs in das gleiche Verzeichnis wie die exe
stijn

Antworten:

2

Solange die Lizenz der VTK-Bibliotheken dies zulässt, können Sie möglicherweise ein NSIS-Installationsskript schreiben (das ein weiterverteilbares Installationsprogramm erstellt), mit dem die VTK-Bibliotheken im stillen Modus installiert werden. Im Ruhemodus (wenn das VTK-Installationsprogramm dies hat) werden die Bibliotheken installiert, ohne dass der Benutzer zur Eingabe aufgefordert wird. So funktionieren die meisten Installationsprogramme für Videospiele (die erforderliche Software wird installiert, ohne dass Sie aufgefordert werden, den Nutzungsbedingungen zuzustimmen oder zu installieren es).

Wenn Sie jedoch nur blind zusätzliche Software installieren, befinden Sie sich möglicherweise in einer prekären Rechtslage. Ich bin mir nicht ganz sicher, ob dies legal ist, aber ich würde vermuten, dass Sie den Benutzer über die gesamte zusätzliche Software informieren müssen, die Sie auf seinem Computer installieren möchten.

In einem der von mir geskripteten Installationsprogramme (für ein Produkt, an dem ich arbeite) muss beispielsweise SQL Server 2005 neben der Binärdatei installiert sein. Wenn auf dem Computer des Benutzers auf dem Computer des Benutzers nicht die erforderliche Version von SQL Server (oder höher) installiert ist, wird die MSI-Datei für SQL Server 2005 (im NSIS-Installationsprogramm enthalten) mit dem Schalter / q aufgerufen. Dadurch wird der SQL Server mit den Standardeinstellungen installiert, und der Benutzer sieht lediglich die Eingabeaufforderung "Installieren von SQL Server 2005", die ausgelöst wird, während das MSI seine Arbeit erledigt. Wir legen großen Wert darauf, den Benutzer darüber zu informieren und ihm die Wahl zu geben, unsere Software ohne sie zu installieren.

Möglicherweise können Sie ein Make erstellen, das alle Ihre Bibliotheken für Sie erstellt, und dann den NSIS Script Builder aufrufen, aber ich bin mir nicht sicher. Ich habe nicht so weit im Kaninchenbau nach NSIS gesucht, da wir Installer-Builds nicht automatisieren.

Natürlich können Sie NSIS durch jede andere Installationsskriptumgebung ersetzen. Ich habe es hier nur als Beispiel verwendet, weil ich ein wenig Erfahrung damit habe.

Jamie Taylor
quelle