在今天的文章中,我们将介绍如何在我们的Ubuntu Core Snap应用中支持多个cpu架构.由于cpu架构的不同,我们的snap应用需要访问不同架构中的和架构名称相关联的lib目录或binary目录.比如对Intel的X86架构来说,他们库的路径中通常含有"x86_64-linux-gnu",而对于ARM架构来说,通过含有"arm-linux-gnueabihf"字样.那么我们如何来使得我们的应用来适配所有的架构呢?
今天我们就以一个例子来说明这个问题:
https://git.launchpad.net/opengles-snaps
我们可以在我们的terminal中打入如下的命令:
$ git clone e https://git.launchpad.net/opengles-snaps
我们可以看一下我们的snapcraft.yaml文件:
snapcraft.yaml
name: opengles-sample version: "1.0" architectures: [ all ] summary: OpenGL ES samples (X11) description: Simple OpenGL ES sample confinement: devmode type: app apps: es2-tringle: command: bin/wrapper plugs: [home,opengl,x11,unity7] parts: opengles-sample: plugin: make build-packages: - libx11-dev - libegl1-mesa - libgles2-mesa-dev stage-packages: - libegl1-mesa - libgles1-mesa - libgles2-mesa - libx11-dev - libxcb-composite0 - libxcb-keysyms1 - libxcb-randr0 - libxcb-shm0 - libxcb-xv0 - libxcb1 - libxext6 - libxi6 - libxinerama1 - libxpm4 - libx11-6 source: src wrapper-copy: plugin: copy files: wrapper: bin/wrapper
这是一个简单的opengl的例程.我们注意到的是它的应用 es2-triangle的执行文件是一个位于bin下的wrapper脚本.通过如果我们的应用设计为多架构的,那么它的执行文件或库都是和架构特有的名称是相关的.在这种情况下,我们必须采取运行一个脚本wrapper的方法来完成.在我们的脚本中,我们可以根据我们的架构来实现对不同路径的访问.关于如何利用wrapper来启动我们的应用,我们也可以参照我的另外一篇文章" 运用wrapper来帮助我们启动snap应用".
wrapper:
#!/bin/bash if [ "$SNAP_ARCH" == "amd64" ]; then ARCH="x86_64-linux-gnu" elif [ "$SNAP_ARCH" == "armhf" ]; then ARCH="arm-linux-gnueabihf" elif [ "$SNAP_ARCH" == "arm64" ]; then ARCH="aarch64-linux-gnu" else ARCH="$SNAP_ARCH-linux-gnu" fi # PATH for dri export LD_LIBRARY_PATH=$SNAP/usr/lib/$ARCH/dri/:$LD_LIBRARY_PATH # Tell libGL where to find the drivers export LIBGL_DRIVERS_PATH=$SNAP/usr/lib/$ARCH/dri export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SNAP_LIBRARY_PATH # debug echo "-> debugging for wrapper" echo $LD_LIBRARY_PATH exec "$SNAP/bin/test_es2tri" "$@"
在X86下安装好我们的snap,并运行这个例子:
在我之前的一篇文章"
利用ubuntu-app-platform提供的platform接口来减小Qt应用大小"中,我的例程中的snapcraft.yaml中有这样的一句: