建立 Linux 二進制檔

建立可在任何 Linux 發行版上被下載並執行的 Linux 二進制檔(就像 OSX 的 .dmg 檔案或 Windows 的 .exe 安裝檔一樣),傳統上一直都很困難。如果您想使用現代的編譯器和功能,這會更加棘手,這在遊戲開發中尤其需要。這個問題仍然沒有簡單的統包解決方案,但只要稍作設定,就可以相對簡單地實現。

安裝系統和 GCC

首先,您需要全新安裝作業系統。您可以使用備用硬體、VirtualBox、雲端或任何您想要的方式。請注意,您安裝的發行版必須至少與您希望支援的最舊版本一樣舊。Debian 穩定版通常是不錯的選擇,但剛發布後您可能需要使用 Debian 舊穩定版或之前的 Ubuntu LTS。CentOS 最舊的支援版本也是一個不錯的選擇。

安裝好系統後,您需要安裝 GCC 的建置相依性。在基於 Debian 的發行版中,可以使用以下命令完成

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

然後在您的主目錄中建立一個 src 子目錄。將以下內容複製貼上到 install_gcc.sh 並執行它。

#!/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

最後,將以下幾行新增到您的 .bashrc

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

登出並重新登入,現在您的建置環境已準備好使用。

新增其他工具

舊的發行版可能擁有某些工具的過舊版本。對於 Meson 來說,這可能包括 Python 3 和 Ninja。如果發生這種情況,您需要以通常的方式下載、建置新版本並將其安裝到 ~/devroot 中。

新增相依性

您希望嵌入並靜態連結您可以的每一個相依性(尤其是 C++ 相依性)。Meson 的 Wrap 套件管理器可能會在此處派上用場。這相當於您在 Windows、OSX、Android 等系統上會做的事情。有時靜態連結是不可能的。在這些情況下,您需要將 .so 檔案複製到您的套件中。讓我們以 SDL2 為例。首先,我們像往常一樣下載並安裝它,並給予我們自訂的安裝前綴(也就是 ./configure --prefix=${HOME}/devroot)。這會讓 Meson 的相依性偵測器自動抓取它。

建置和安裝

建置過程與正常情況大致相同。有兩件事需要注意。首先,您必須告訴 GCC 靜態連結 C++ 標準函式庫。如果您不這樣做,您的應用程式保證會崩潰,因為不同的發行版具有二進制不相容的 C++ 函式庫。第二件事是您需要將您的安裝前綴指向一些空的暫存區域。以下是執行此操作的 Meson 命令

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

目的是將可執行檔放入 /tmp/myapp/bin,並將共享函式庫放入 /tmp/myapp/lib。接下來您需要的是嵌入器。它會取得您的相依性(在此情況下僅為 libSDL2-2.0.so.0)並將它們複製到 lib 目錄中。根據您的用例,您可以手動複製檔案,或者編寫一個腳本來解析 ldd binary_file 的輸出。請務必不要複製系統函式庫(libclibpthreadlibm 等)。有關範例,請參閱範例專案

使用此方法讓腳本在安裝期間執行

meson.add_install_script('linux_bundler.sh')

最後步驟

如果您現在嘗試執行程式,它很可能無法啟動或崩潰。原因是系統不知道可執行檔需要來自 lib 目錄的函式庫。解決方案是一個簡單的包裝腳本。建立一個名為 myapp.sh 的腳本,其內容如下

#!/bin/bash

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

使用此 Meson 片段安裝它

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

現在您就完成了。壓縮您的 /tmp/myapp 目錄,您就擁有一個準備好部署的可用二進制檔。要執行程式,只需解壓縮檔案並執行 myapp.sh 即可。

搜尋結果為