创建 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

搜索结果为