Linux aarch64交叉编译之 weston窗口管理程序
对于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窗口管理程序相关推荐
- Linux aarch64交叉编译之 mesa图形库
对于mesa的交叉编译.该文章的目标是编译一套aarch64 Linux Debian嵌入式版本上可以运行的版本库,接下来就开始趟坑.老套路,先把linux桌面版搞好,然后 移植到嵌入式Linux D ...
- Linux aarch64交叉编译之 assimp模型库
对于assimp的交叉编译,目前网上没见到debian版本aarch64版本上搞过的,因此整一篇.该文章的目标是编译一套aarch64 Linux Debian嵌入式版本上可以运行的版本库,接下来就开 ...
- Linux aarch64交叉编译之 Google filament引擎
对于filament的编译.该文章的目标是编译一套aarch64 Linux Debian嵌入式版本上可以运行的库,本来想在网上找些现成的,然而 资料少的一13,接下来就开始趟坑.老套路,先把linu ...
- linux 上编译arm64,Arch Linux 搭建 arm64/AArch64 交叉编译环境
Arch Linux 搭建 arm64/AArch64 交叉编译环境 0. 系统环境 系统: Arch Linux: 成文时间最新 工具版本:Binutils:2.34-1 GCC:9.2.1+202 ...
- Kali Linux打开多个终端窗口
Kali Linux打开多个终端窗口 在Kali Linux系统中,大部分工具都是命令行工具.大学霸IT达人所以,用户需要在终端窗口执行.但是,一些操作可能需要同时执行多个命令,因此需要同时打开多个窗 ...
- Zedboard学习(二):zedboard的Linux下交叉编译环境搭建
环境准备 首先肯定是要下载xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin文件,这是官方提供的linux下交叉编译链安装文件,下载地址为:https://p ...
- arm hisiv100 linux,hisiv100交叉编译工具链安装
hisi交叉编译工具链安装 一. 摘要: 交叉编译简单的说,就是A机器上编译生成,运行在B机器上.那么在A机器上的编译工具安装,就是本文所要描述的内容. 工欲善其事必先利其器,所以交叉 ...
- win10+Xming+Xshell显示远程linux服务器的图形程序窗口
Xshell的安装: Xshell的下载与使用 - 知乎 Xming的安装 1. 在bing页面搜索Xming,进入官网 2. 直接download 3. 下载完毕,点开安装包,直接按默认设置一路点击 ...
- mDNS实现之Bonjour与Avahi(一)——win/linux/arm交叉编译
0.Part2:mDNS实现之Bonjour与Avahi(二)--win/linux/arm交叉编译_平凡之路-CSDN博客1.BonjourBonjour - Apple Developer● 源码 ...
最新文章
- 陆奇疫情之下最新思考:数字化的历史潮流在加速,送给创新者8个字2个维度...
- 阿里云centos 6.3 安装宝塔nginx面板无法远程mysql数据库和无法FTP连接问题解决方法
- javadrawstring设置字符大小_LaTex学术写作——编辑文档格式 设置论文标题与摘要...
- Orleans学习总结(二)--创建工程
- 在 SUSE 11 sp2 上安装 freeradius
- MyEclipse里更改字体大小和快捷建的设置
- 微博polg什么意思_成都网站代运营是什么意思?-建站
- linux 进程开始与终止
- 接口500什么原因_80%小餐饮店几乎都“活“不过500天,为什么?都在这5个原因里...
- SQL | 目录(持续更新)
- php手机关闭程序,php用手机关闭电脑的方法
- 设置部分文件不适用ARC机制
- Atitit v2 工作计划与工作日志推荐格式markdown 与模板 attilax 总结
- QCA9377 QCA1023系列蓝牙WiFi二合一模块方案选型参考
- 记录使用itextpdf通过定位插入图片和文字
- python3的下载和安装
- 电脑桌面云便签怎么设置短信提醒便签事项?
- 微信支付当前url未注册问题
- d6.VUE基础20211229
- 使用本机系统ubuntu搭建SRS GB28181服务器和推流
热门文章
- 有没有可以跨平台的待办事项清单软件推荐?
- java简单程序彩票系统!
- 树莓派centos踩坑之旅,解决每次重启都需要route add才能有网络
- TR069协议向导—— 一个帮助你了解TR069协议的简明教程(二)
- mysql修改列明sql语句_sqlserver 修改列名及表名的sql语句
- C语言 - 隐式类型转换
- 下载并安装vue-devtools(详细步骤)
- python中math函数_python中math模块函数
- 企业各职位英文缩写 PM,TM,PL,TL,SE,PG,CEO,CFO
- 对互联网VC的10点看法