ArchLinux和Meson构建工具的使用

爱恨交加的CentOS

我最开始接触的Linux系统是CentOS,因为有sob的讲解,很快上手。CentOS简洁明亮的界面给我留下了很深的好感,也不需要时不时就敲个sudo。从分子动力学和量子化学,到用LaTex写论文,再到学习Caffe,2019年上半年的经历甚至都能用CentOS穿出一条线。

但这次编译VapourSynth着实让我感觉蛋疼。

编译VapourSynth

用了这么长时间的Linux,基本的编译套路也该熟悉了。一般开发者都会提供autogen.sh或者configure文件,运行一下。然后makemake install

1
2
3
4
5
cd vapoursynth
./autogen.sh
./configure
make
make install

make这一步,编译到exprfilter.cpp这个文件时,出现了一堆报错。我看了一下,exprfilter.cpp应该是针对32bit系统定义了一些常量,报的错是说这些常量没有被声明。

这不是当然的吗?!难道编译器选择性地忽视了#ifndfe CPU_32#endif…好像还真是,我把被#ifndfe CPU_32#endif框起来的语句都删除后,就不报错了…

感觉我的编译器是个智障…

然而,继续编译,一个文件名带有avx2字样的cpp文件,编译器干脆连注释都不认识…

搜索了一下,发现有人把GCC编译器从4.8升级到了5.3,就解决了类似不认识#ifndfe的问题。而且升级编译器,也能更好地支持C++的新标准。

我盘算了一下,比起升级编译器,我干脆换个系统吧…之前有人说CentOS的依赖包陈旧,我在装caffe时就感觉到了(有些包需要手动编译新版本,而不能用yum直接装),而这次编译器出问题…emmm我还是尝试一下别的系统吧。

ArchLinux的安装使用

这个也没啥好说的,虽然ArchLinux在Linux系统下也算是入门门槛较高的了,但教程很详尽,照着做就好。

安装依赖使用pacman -S package,但是不能指定版本,只提供最新版。

说起来,我的转变也是很大的:之前用最小安装的CentOS,只是好玩;现在用没有桌面的ArchLinux,也能完成实际工作了。

因为没有装桌面,只说一下pacman给我的感受。感觉很方便,既不需要想Ubuntu那样没事敲sudo,又不需要担心CentOS提供的包没有更新,也不需要担心CentOS下的包有不一样的名字。

顺便学了/复习了Linux下的常用命令。

Meson与pkg-config的使用

Meson

Meson和ninja在ArchLinux下一键安装,基础的cmake、VapourSynth需要的pkg-config,都是一样。

1
2
3
pacman -S cmake
pacman -S meson
pacman -S pkg-config

只是VapourSynth需要版本限定的zimg v2.9,而pacman又只提供最新版。但我试了一下,目前最新版的zimg v2.9.2和VapourSynth R49(这个时候R49还没有发布,但我之后编译好,发现版本号已经改成R49了),至少在编译阶段没有冲突。

目前Meson没什么好说的,因为我现在的项目,还是结构很简单的项目,而且Meson的语法简单明了。只是Meson的教程藏得有点深,推荐去Github上看,https://github.com/mesonbuild/meson/blob/master/docs/markdown/Reference-manual.md

pkg-config

关于pkg-config,我搜了一下,应该和Meson一样,也是一款跨平台的工具…但我觉得,还是只在Linux下用吧…

使用pkg-config的项目要写一个.pc后缀的配置文件,具体到VapourSynth,就是说明了头文件的位置。这个.pc文件会在项目中提供,要自己放到usr/lib/pkgconf下面,然后使用pkg-config时就会到这里搜索。

在我看来,这样避免了每新面对一个项目就重新配环境。

.pc文件也容易读懂,就是通常的配置文件的内容。

在Linux下编译VapourSynth Plugin

上面的准备工作都完成后,两行命令

1
2
meson build
ninja -C build

即可完成编译,得到期待已久的libxxx.so文件。

今天顺利用上ArchLinux,并确认编译出错源自GCC编译器的陈旧。

成功编译VapourSynth。

成功借助Meson在Linux下编译VapourSynth Plugin。

虽然现在看来不算难事,但在不久的之前,还是困扰我的问题。所以,我的进步是看得见的。

这种扎实的喜悦是一方面。而另一方面,在编译中看着跳动的命令行,感受到计算机内部是怎样运行,而且也不再把红色的Error看得不可解决,这也是感性的成长。