近期由于项目中需要用到libinput库文件,但实际运行的设备中可能涉及到x86架构的CPU和ARM架构CPU两种,因此考虑到ARM架构下的系统很多都是裁剪过的,且工作机器不一定联网,因此需要将libinput库通过源码编译生成对应的库文件。
libinput的源码在网上能搜到,但大多数都是基于meson脚本和ninja编译的。因为使用的容器进行开发,而meson的依赖包又有一大堆,为了编译一个库而安装一大堆依赖包在容器里面,很麻烦也不利于项目组成员之间统一开发环境。因此决定找一个不使用meson和ninja编译的libinput的源码。最终在一个debian的gitla库上找到了一份使用automake编译的libinput库。
源码路径在此,需要自取:Files · ubuntu · X Strike Force / lib / libinput · GitLablibinput packaginghttps://salsa.debian.org/xorg-team/lib/libinput/-/tree/ubuntu?ref_type=heads automake的操作作为开发人员肯定就比较熟悉了,这里就不多介绍了。重点记录下编译过程中的一些小问题。
1.依赖包安装
最开始通过autogen.sh生成后,默认就执行configure进行配置,然后就报了一堆依赖包缺失。根据提示缺失的包逐个安装。算了下这些包安装下来消耗了600~800M左右的空间。虽然磁盘空间不值钱,但是对于一个docker容器来说,最好还是不要过于太大了,要不然需要分享容器镜像的时候就有些费时间了。依赖包逐个装好之后,编译生成静态库和动态库都没有问题。
2.删减依赖包
根据执行configure之后的提示,部分功能是可选的,也就是可以不要这部分功能,如此也就不需要对应的依赖包。configure执行时添加参数禁用功能:--disable-documentation --disable-debug-gui --disable-tests --disable-libwacom。
-disable-documentation 不生成文档,因此不需要依赖dot
--disable-debug-gui 不要UI,因此不依赖gtk相关的所有包
--disable-tests 不编译测试用例
--disable-libwacom 不适用wacom,因此不依赖libwacom库
如此调整后,最终必须依赖的安装包仅有libmtdev-dev和libevdev-dev两个。
最终configure命令:
./configure --enable-shared --disable-documentation --disable-debug-gui --disable-tests --disable-libwacom
3.动态库和静态库的差别
configure配置时--enable-shared是生成动态库,--enable-static是生成静态库,默认不给这两个参数时就是生成动态库。根据实际生成的动态库和静态库来看,动态库与通过apt安装的差别不大,除了版本的区别。但生成的静态库并不是预想的libinput.a,而是如下的三个库文件
使用命令find . -name *.a |xargs nm -g --defined-only查看这几个静态库中定义的函数发现,和动态库中函数并不一样。所以这个生成的库目前看来只能使用动态库是与通过apt安装的一样的,静态库的差别后续再做研究,有知道的大佬可以留言帮我分析下。
生成的动态库链接到执行文件后效果是否相同还需要后续再验证。