创建 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
的输出。确保不要复制系统库(libc
、libpthread
、libm
等)。例如,请查看 示例项目。
使用此代码在安装过程中运行脚本
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
。
搜索结果为