对于weston的交叉编译。该文章的目标是编译一套aarch64 Linux Debian嵌入式版本上可以运行的版本库以及相关程序,接下来就开始趟坑。老套路,先把linux桌面版搞好,然后 移植到嵌入式Linux Debian 板子上。

1 weston的来龙去脉

在介绍weston之前,我们不得不来说说wayland。因为weston本质上就是wayland的一种实现。而说到wayland,又不得不提一下X11,那么接下来我们从X11->wayland->weston这条路线系统地理解下weston。

Wayland资料索引:

  • Wayland官网为:https://wayland.freedesktop.org/
  • Wayland官方文档学习手册:Wayland学习手册

我们基于黄金圈法则,搞懂why,也就是为啥要搞出一个wayland来?那我们首先就要了解历史,先来看看X11。

1.1 X11,一个古老的图形系统

这里X表示的是协议,是1984年起始于 MIT(麻省理工学院)。11表示的是协议的版本号(实际版本是11 release 7.6),是在 1987年9月提出的。该方案是由 X 基金会所领导。

在wayland出来之前,Linux系统一直使用X11图形系统,这是一个古老的系统,到目前为止有近40年的历史,设计之初是因为个人PC性能低,所以构建了这样架构:

  • 所有渲染相关的计算都放在X Server端(本地的X显示程序,提供显示服务,它扮演了服务器的角色),而X Client端是既可以运行在本地端,也可以运行在网络端,代表客户端角色。
  • X Server和XClient通信的手段就是X Protocol。所有的客户端接收到鼠标,键盘等等事件,都要通知Server,Server经过计算,通知驱动层进行绘制。

1.2 wayland诞生缘由和原理,性能大幅度提升带来的变革

Wayland的定位:替换Linux上的X11系统。

Wayland协议诞生的缘由:

  • X11的框架在当时计算机性能较弱的环境下几乎是唯一可行的方式,但随着计算机性能的提升,“客户端”也有很强大的渲染能力。
  • 原本在X11图形系统中 X Server中做的事很多已被移到kernel或者单独的库中,因此X Server就显得比较累赘了。

接下来谈谈Wayland本身,也就是what:

@1 Wayland是啥?

Wayland是一种表示显示系统server端与client端之间的通信协议。与X11相比只是原理不同而已。

@2 Wayland原理是啥?

Wayland的大概原理是:所有渲染都发生在client端,client端根据自己的业务逻辑构建相应的图形界面,计算需要渲染render的区域,然后在内存中开辟一段空间(可以是共享内存,也可以是显存,取决于实际硬件,注意,这里不是buffer的拷贝,而是把buffer的fd直接进行传递,效率高),将绘制好的图像放入buffer中,通知Wayland的Server(Compositor,表图像合成器),Compositor会监听所有client的请求,把所有Client绘制好的图片合成后发送到渲染器渲染并显示。

这种设计相比X11大幅度减少了Client和Server的频繁交互和数据传递,所以效率大幅度提高。

1.3 关键解读:Weston是啥?

Weston是Wayland compositor的参考实现(就像OpenGL是一种标准,而mesa是OpenGL的一种实现一样)。其官网为http://wayland.freedesktop.org/

最后附上weston的Github下载地址:GitHub - wayland-project/weston

2 Linux 本地编译 & 交叉编译

2.1 Linux(ubuntu20.04)上 weston的编译

weston是使用meson进行编译的,根据README.md的提示,编译关键步骤如下:

$meson build
$ninja -C build
$ninja -C build install

这里关于安装位置,可以通过--prefix=具体路径来设置。

2.2 aarch64交叉编译与移植

2.2.1 交叉编译

因为是用aarch64交叉编译,需要提前配置环境,安装如下软件:

sudo apt install binutils-aarch64-linux-gnu-dbg binutils-aarch64-linux-gnu cpp-aarch64-linux-gnu \
g++-10-aarch64-linux-gnu g++-9-aarch64-linux-gnu g++-aarch64-linux-gnu g++ \
gcc-10-aarch64-linux-gnu-base gcc-9-aarch64-linux-gnu-base gcc-aarch64-linux-gnu \
pkg-config-aarch64-linux-gnu qemu-efi-aarch64 gcc arch-test

构建一个sysroot路径需要用到的aarch64虚拟机,方式如下:

#创建一个虚拟fs文件系统
$sudo qemu-debootstrap --arch arm64 bullseye /mnt/data/arm64 http://deb.debian.org/debian/
#进入到文件系统
$sudo chroot /mnt/data/arm64/
#退出文件系统
$exit

在weston目录下构建一个arm64文件,内容如下:

[binaries]
c = 'aarch64-linux-gnu-gcc'
cpp = 'aarch64-linux-gnu-cpp'
ar = 'aarch64-linux-gnu-gcc-ar'
strip = 'aarch64-linux-gnu-strip'
pkgconfig = 'aarch64-linux-gnu-pkg-config'
ld = 'aarch64-linux-gnu-ld'
pcap-config = ''
cmake = 'cmake'[properties]
skip_sanity_check = true
sys_root = '/mnt/data/arm64'
# Generate binaries that are portable across all Armv8 machines
platform = 'generic'
pkg_config_libdir ='/mnt/data/arm64/usr/lib/aarch64-linux-gnu/pkgconfig:/mnt/data/arm64//usr/share/pkgconfig'[built-in options]
c_args = ['--sysroot', '/mnt/data/arm64']
c_link_args = ['-Wl,-rpath', '/mnt/data/arm64/usr/lib/aarch64-linux-gnu/', '-Wl,--as-needed'][host_machine]
system = 'linux'
cpu_family = 'aarch64'
cpu = 'armv8-a'
endian = 'little'

之后在weston目录下执行:

$meson build --cross-file arm64.txt
$ninja -C build
$ninja -C build install

注意:这个时候编译有可能出现各种缺库的问题,我们需要执行

$sudo chroot /mnt/data/arm64/
$apt search [缺的库 关键字检索]
$apt-file search [缺少的头文件之类的关键字检索]
$apt install [相关的库]

也就是进入到sysroot对应的虚拟机/mnt/data/arm64中安装缺失的库。

2.2.2 解决移植中的库链接问题

通过前面的操作,编译成功后可以将weston其移动到debian开发板上(注意:开发版的库 需要和 虚拟机运行时缺少的库作同步)。但是这时候发现会有很多链接的错误,找不到库,我们这样调整

调整compositor中内容,主要是将环境变量WESTON_MODULE_MAP置空,进而在链接库的时候走默认路径,weston代码修改如下:

diff --git a/weston/libweston/compositor.c b/weston/libweston/compositor.c
index a594d67..bd942da 100644
--- a/weston/libweston/compositor.c
+++ b/weston/libweston/compositor.c
@@ -7985,7 +7985,7 @@ weston_version(int *major, int *minor, int *micro)WL_EXPORT size_tweston_module_path_from_env(const char *name, char *path, size_t path_len){
-       const char *mapping = getenv("WESTON_MODULE_MAP");
+       const char *mapping ="";// getenv("WESTON_MODULE_MAP");const char *end;const int name_len = strlen(name);

接下来修改weston配置文件meson_options.txt,修改内容如下:

diff --git a/weston/meson_options.txt b/weston/meson_options.txt
index 32daa01..cb9c179 100644
--- a/weston/meson_options.txt
+++ b/weston/meson_options.txt
@@ -85,6 +85,20 @@ option(description: 'Xwayland: path to installed Xwayland binary')+option(
+        'x-moduledir-path',
+        type: 'string',
+        value: 'default',
+        description: 'x define for different moduledir path'
+)
+
+option(
+        'x-libwestonmoduledir-path',
+        type: 'string',
+        value: 'default',
+        description: 'x define for different libweston moduledir path'
+)
+option('systemd',type: 'boolean',

接下来修改weston的配置文件meson.build,将MODULEDIR 和LIBWESTON_MODULEDIR的默认加载路径重新设置,如下所示:

diff --git a/weston/meson.build b/weston/meson.build
index 63943f3..6ecf32c 100644
--- a/weston/meson.build
+++ b/weston/meson.build
@@ -116,8 +116,11 @@ config_h.set_quoted('PACKAGE_BUGREPORT', 'https://gitlab.freedesktop.org/waylandconfig_h.set_quoted('BINDIR', dir_bin)config_h.set_quoted('DATADIR', dir_data)config_h.set_quoted('LIBEXECDIR', dir_libexec)
-config_h.set_quoted('MODULEDIR', dir_module_weston)
-config_h.set_quoted('LIBWESTON_MODULEDIR', dir_module_libweston)
+
+#config_h.set_quoted('MODULEDIR',dir_module_weston)
+#config_h.set_quoted('LIBWESTON_MODULEDIR',dir_module_libweston)
+config_h.set_quoted('MODULEDIR', get_option('x-moduledir-path'))
+config_h.set_quoted('LIBWESTON_MODULEDIR', get_option('x-libwestonmoduledir-path'))config_h.set10('TEST_GL_RENDERER', get_option('test-gl-renderer'))

修改好代码后,这次我们重新编译,执行meson时候多了两个宏的设置,详细如下:

$meson build --prefix=[交叉编译输出路径] \
-Dx-moduledir-path=[开发板 库路径] \
-Dx-libwestonmoduledir-path=[开发板 库路径] \
--cross-file arm64.txt
$ninja -C build
$ninja -C build install

之后编译出来的库和相关bin文件就可以在开发板上运行啦~。

特殊说明:之前在解决该问题时优先考虑的是设置LD_LIBRARY_PATH变量,但是发现并不管用,这是为什么呢?因为weston人家自己搞了一套设置加载库路径的东东,那为啥要这么搞呢?如果看了代码我们会知道,weston是使用dlopen这种方式直接打开库的,并不是简单的加载,因此 LD_LIBRARY_PATH这种链接库的设置是无效的。

Linux aarch64交叉编译之 weston窗口管理程序相关推荐

  1. Linux aarch64交叉编译之 mesa图形库

    对于mesa的交叉编译.该文章的目标是编译一套aarch64 Linux Debian嵌入式版本上可以运行的版本库,接下来就开始趟坑.老套路,先把linux桌面版搞好,然后 移植到嵌入式Linux D ...

  2. Linux aarch64交叉编译之 assimp模型库

    对于assimp的交叉编译,目前网上没见到debian版本aarch64版本上搞过的,因此整一篇.该文章的目标是编译一套aarch64 Linux Debian嵌入式版本上可以运行的版本库,接下来就开 ...

  3. Linux aarch64交叉编译之 Google filament引擎

    对于filament的编译.该文章的目标是编译一套aarch64 Linux Debian嵌入式版本上可以运行的库,本来想在网上找些现成的,然而 资料少的一13,接下来就开始趟坑.老套路,先把linu ...

  4. linux 上编译arm64,Arch Linux 搭建 arm64/AArch64 交叉编译环境

    Arch Linux 搭建 arm64/AArch64 交叉编译环境 0. 系统环境 系统: Arch Linux: 成文时间最新 工具版本:Binutils:2.34-1 GCC:9.2.1+202 ...

  5. Kali Linux打开多个终端窗口

    Kali Linux打开多个终端窗口 在Kali Linux系统中,大部分工具都是命令行工具.大学霸IT达人所以,用户需要在终端窗口执行.但是,一些操作可能需要同时执行多个命令,因此需要同时打开多个窗 ...

  6. Zedboard学习(二):zedboard的Linux下交叉编译环境搭建

    环境准备 首先肯定是要下载xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin文件,这是官方提供的linux下交叉编译链安装文件,下载地址为:https://p ...

  7. arm hisiv100 linux,hisiv100交叉编译工具链安装

    hisi交叉编译工具链安装 一.         摘要: 交叉编译简单的说,就是A机器上编译生成,运行在B机器上.那么在A机器上的编译工具安装,就是本文所要描述的内容. 工欲善其事必先利其器,所以交叉 ...

  8. win10+Xming+Xshell显示远程linux服务器的图形程序窗口

    Xshell的安装: Xshell的下载与使用 - 知乎 Xming的安装 1. 在bing页面搜索Xming,进入官网 2. 直接download 3. 下载完毕,点开安装包,直接按默认设置一路点击 ...

  9. mDNS实现之Bonjour与Avahi(一)——win/linux/arm交叉编译

    0.Part2:mDNS实现之Bonjour与Avahi(二)--win/linux/arm交叉编译_平凡之路-CSDN博客1.BonjourBonjour - Apple Developer● 源码 ...

最新文章

  1. 陆奇疫情之下最新思考:数字化的历史潮流在加速,送给创新者8个字2个维度...
  2. 阿里云centos 6.3 安装宝塔nginx面板无法远程mysql数据库和无法FTP连接问题解决方法
  3. javadrawstring设置字符大小_LaTex学术写作——编辑文档格式 设置论文标题与摘要...
  4. Orleans学习总结(二)--创建工程
  5. 在 SUSE 11 sp2 上安装 freeradius
  6. MyEclipse里更改字体大小和快捷建的设置
  7. 微博polg什么意思_成都网站代运营是什么意思?-建站
  8. linux 进程开始与终止
  9. 接口500什么原因_80%小餐饮店几乎都“活“不过500天,为什么?都在这5个原因里...
  10. SQL | 目录(持续更新)
  11. php手机关闭程序,php用手机关闭电脑的方法
  12. 设置部分文件不适用ARC机制
  13. Atitit v2 工作计划与工作日志推荐格式markdown 与模板 attilax 总结
  14. QCA9377 QCA1023系列蓝牙WiFi二合一模块方案选型参考
  15. 记录使用itextpdf通过定位插入图片和文字
  16. python3的下载和安装
  17. 电脑桌面云便签怎么设置短信提醒便签事项?
  18. 微信支付当前url未注册问题
  19. d6.VUE基础20211229
  20. 使用本机系统ubuntu搭建SRS GB28181服务器和推流

热门文章

  1. 有没有可以跨平台的待办事项清单软件推荐?
  2. java简单程序彩票系统!
  3. 树莓派centos踩坑之旅,解决每次重启都需要route add才能有网络
  4. TR069协议向导—— 一个帮助你了解TR069协议的简明教程(二)
  5. mysql修改列明sql语句_sqlserver 修改列名及表名的sql语句
  6. C语言 - 隐式类型转换
  7. 下载并安装vue-devtools(详细步骤)
  8. python中math函数_python中math模块函数
  9. 企业各职位英文缩写 PM,TM,PL,TL,SE,PG,CEO,CFO
  10. 对互联网VC的10点看法