Erstellen von Linux-Binärdateien

Das Erstellen von Linux-Binärdateien, die auf jeder Distribution heruntergeladen und ausgeführt werden können (wie .dmg-Pakete für OSX oder .exe-Installer für Windows), war traditionell schwierig. Dies ist noch kniffliger, wenn Sie moderne Compiler und Funktionen verwenden möchten, was besonders in der Spieleentwicklung erwünscht ist. Es gibt immer noch keine einfache schlüsselfertige Lösung für dieses Problem, aber mit etwas Einrichtung kann es relativ einfach sein.

Installation von System und GCC

Zuerst müssen Sie eine frische Betriebssysteminstallation durchführen. Sie können Ersatzhardware, VirtualBox, Cloud oder was auch immer Sie möchten verwenden. Beachten Sie, dass die von Ihnen installierte Distribution mindestens so alt sein muss wie die älteste Version, die Sie unterstützen möchten. Debian Stable ist normalerweise eine gute Wahl, obwohl Sie unmittelbar nach seiner Veröffentlichung möglicherweise Debian Oldstable oder die vorherige Ubuntu LTS verwenden möchten. Die älteste unterstützte Version von CentOS ist ebenfalls eine gute Wahl.

Nachdem Sie das System installiert haben, müssen Sie die Build-Abhängigkeiten für GCC installieren. In Debian-basierten Distributionen kann dies mit den folgenden Befehlen erfolgen

$ apt-get build-dep g++
$ apt-get install pkg-config libgmp-dev libmpfr-dev libmpc-dev

Erstellen Sie dann ein Unterverzeichnis src in Ihrem Home-Verzeichnis. Kopieren Sie Folgendes in install_gcc.sh und führen Sie es aus.

#!/bin/sh

wget ftp://ftp.fu-berlin.de/unix/languages/gcc/releases/gcc-4.9.2/gcc-4.9.2.tar.bz2
tar xf gcc-4.9.2.tar.bz2

mkdir objdir
cd objdir
../gcc-4.9.2/configure --disable-bootstrap --prefix=${HOME}/devroot \
                       --disable-multilib --enable-languages=c,c++
make -j 4
make install-strip
ln -s gcc ${HOME}/devroot/bin/cc

Fügen Sie dann abschließend die folgenden Zeilen zu Ihrer .bashrc hinzu.

$ export LD_LIBRARY_PATH=${HOME}/devroot/lib
$ export PATH=${HOME}/devroot/bin:$PATH
$ export PKG_CONFIG_PATH=${HOME}/devroot/lib/pkgconfig

Melden Sie sich ab und wieder an, und Ihre Build-Umgebung ist nun einsatzbereit.

Hinzufügen weiterer Werkzeuge

Alte Distributionen haben möglicherweise zu alte Versionen einiger Werkzeuge. Für Meson könnten dies Python 3 und Ninja sein. Wenn dies der Fall ist, müssen Sie neue Versionen herunterladen, kompilieren und unter ~/devroot auf die übliche Weise installieren.

Hinzufügen von Abhängigkeiten

Sie möchten jede Abhängigkeit, die Sie können (insbesondere C++-Abhängigkeiten), einbetten und statisch verknüpfen. Das Meson Wrap-Paketmanager kann hier hilfreich sein. Dies entspricht dem, was Sie unter Windows, OSX, Android usw. tun würden. Manchmal ist statisches Verknüpfen nicht möglich. In diesen Fällen müssen Sie die .so-Dateien in Ihr Paket kopieren. Nehmen wir SDL2 als Beispiel. Zuerst laden wir es herunter und installieren es wie üblich, wobei wir ihm unser benutzerdefiniertes Installationspräfix geben (d. h. ./configure --prefix=${HOME}/devroot). Dies veranlasst den Abhängigkeitsdetektor von Meson, es automatisch zu erkennen.

Kompilieren und Installieren

Das Kompilieren geschieht weitgehend wie gewohnt. Es gibt nur zwei Dinge zu beachten. Erstens müssen Sie GCC anweisen, die C++-Standardbibliothek statisch zu verknüpfen. Wenn Sie dies nicht tun, wird Ihre App mit Sicherheit fehlschlagen, da verschiedene Distributionen binär inkompatible C++-Bibliotheken haben. Das zweite ist, dass Sie Ihr Installationspräfix auf einen leeren Staging-Bereich verweisen müssen. Hier ist der Meson-Befehl, um dies zu tun

$ LDFLAGS=-static-libstdc++ meson --prefix=/tmp/myapp <other args>

Ziel ist es, die ausführbare Datei in /tmp/myapp/bin und die gemeinsam genutzten Bibliotheken in /tmp/myapp/lib zu platzieren. Das nächste, was Sie brauchen, ist der Einbettungsmechanismus. Er nimmt Ihre Abhängigkeiten (in diesem Fall nur libSDL2-2.0.so.0) und kopiert sie in das Lib-Verzeichnis. Abhängig von Ihrem Anwendungsfall können Sie die Dateien entweder von Hand kopieren oder ein Skript schreiben, das die Ausgabe von ldd binary_file analysiert. Achten Sie darauf, keine Systembibliotheken zu kopieren (libc, libpthread, libm usw.). Ein Beispiel finden Sie im Beispielprojekt.

Lassen Sie das Skript während der Installation mit diesem Befehl ausführen

meson.add_install_script('linux_bundler.sh')

Letzte Schritte

Wenn Sie versuchen, das Programm jetzt auszuführen, wird es höchstwahrscheinlich nicht starten oder abstürzen. Der Grund dafür ist, dass das System nicht weiß, dass die ausführbare Datei Bibliotheken aus dem Verzeichnis lib benötigt. Die Lösung hierfür ist ein einfaches Wrapper-Skript. Erstellen Sie ein Skript namens myapp.sh mit folgendem Inhalt

#!/bin/bash

cd "${0%/*}"
export LD_LIBRARY_PATH="$(pwd)/lib"
bin/myapp

Installieren Sie es mit diesem Meson-Snippet

install_data('myapp.sh', install_dir : '.')

Und jetzt sind Sie fertig. Packen Sie Ihr Verzeichnis /tmp/myapp als ZIP-Datei und Sie haben eine funktionierende Binärdatei, die bereit für die Bereitstellung ist. Um das Programm auszuführen, entpacken Sie einfach die Datei und führen Sie myapp.sh aus.

Die Ergebnisse der Suche sind