Ubuntu下自己编译一套cairo库,这事我干过好几回,每次都能遇到点新问题。前两天又帮同事搞了一轮,顺手整理成一篇实操记录,正好把编译过程中那些容易踩的坑、官方文档没明说的细节一并写出来。
cairo这个名字,做图形渲染的朋友应该不陌生。它是目前Linux桌面上非常核心的2D矢量图形库,GTK界面绘制、WebKit网页渲染、PDF生成这些场景背后都有它。系统仓库里一般自带编译好的版本,直接apt install libcairo2-dev就能用,但真到了需要定制特性、裁剪依赖、移植到嵌入式平台或者静态链接进自有产品的时候,还是绕不开手动编译这条老路。
这次我以最新稳定分支为例,从依赖准备、Meson构建、静态库处理到问题排查,把整条链路完整展示出来。无论你是刚接触Linux开发的新手,还是被特殊构建需求折磨的老手,这份记录应该都能让你少走不少弯路。
1. 动手之前:先搞懂cairo的依赖体系和版本选择
1.1 为什么要自己编译而不是直接用系统包
很多人一开始会问这个问题,系统的libcairo2-dev装完直接用不好吗?大部分场景确实够用,但有几个典型情况逼着你必须走源码编译这条路。
最常见的是版本锁定。某个嵌入式项目或者某个老产品长期固定在特定发行版上,系统仓库里的cairo版本可能停留在某个旧版本,而你的业务代码需要用到新版本才有的接口特性。这种情况下源码编译几乎成了唯一方案。
其次是特性裁剪。cairo的完整依赖链不算轻,字体渲染要freetype和fontconfig,图像读写要libpng、libjpeg,硬件加速要OpenGL相关组件,某些X11辅助功能还需要xcb库。桌面环境可以全部带上,但放到资源受限的设备上,能砍则砍。通过源码编译时的Meson配置选项,可以精确关掉不需要的依赖,编译产物能明显瘦一圈。
再就是静态链接场景。很多交叉编译工具链和独立交付的二进制程序,需要把cairo以静态库形式打进去。系统自带的开发包一般只提供动态库(.so),带静态库(.a)的发行版其实不多。自己编译可以同时产出两种形式,并且还能把静态库里的调试符号裁剪掉,让最终交付体积可控。
1.2 版本选型和构建系统对应关系
cairo这个项目分两个阶段,对构建方式影响很大。1.16.x及更早的版本使用经典的autotools构建体系,编译流程是熟悉的./configure && make && make install三步曲。从1.18.0开始,项目全面转向Meson构建系统,命令行也变成了meson setup加ninja。
我个人的建议是,新项目一律用最新稳定版,也就是1.18系列。不仅是因为Meson在依赖检测和并行编译上更省心,还因为新版修复了不少字体渲染边缘情况和后端兼容问题。老项目的维护编译才考虑1.16分支,而且要用对应的autotools流程。
需要注意一点:下载源码时不要简单从dist源码包拿一个就完事,最好去cairo的官方发布目录或者Git仓库的tag里挑。Git仓库里master分支是滚动开发状态,可能带一些未稳定提交,拿来做产品级构建未必合适。选取具体tag时,格式一般是形如1.18.2这种发布编号。
1.3 cairo的依赖树梳理
编译cairo前,脑子要先有一张依赖地图。它是典型的底层图形库,依赖几乎铺满了系统基础工具的方方面面。
- pixman:cairo渲染最核心的底层像素操作库,所有软件光栅化路径都依赖它,直接决定渲染性能和色彩精度。
- freetype和fontconfig:字体加载、字形轮廓提取与字体匹配,cairo的文字绘制靠这两家支撑。
- libpng和libjpeg:支持读取、写入PNG和JPEG图像,用于把渲染结果输出为图片文件。
- glib:提供基础数据结构与内存管理的辅助,cairo内部不少对象模型借助glib构建。
- X11相关库:xlib和xcb分别对应X11的两套客户端接口,在X Window系统上做窗口绘图时不能少。
- OpenGL相关组件:开启GL后端时,cairo能借GPU加速渲染,依赖OpenGL扩展头和运行库。
下表把这些依赖的作用和对应系统包名整理在一起,方便对照安装。系统包名是Ubuntu常见写法,其他分支根据包管理器调整。
| 依赖组件 | 作用说明 | Ubuntu包名 |
|---|---|---|
| pixman | 底层像素操作与软件光栅化 | libpixman-1-dev |
| freetype | 字形轮廓提取、字体光栅化 | libfreetype-dev |
| fontconfig | 系统字体配置与字体选择 | libfontconfig-dev |
| libpng | PNG图像编解码 | libpng-dev |
| libjpeg | JPEG图像编解码 | libjpeg-dev |
| glib | 基础数据结构和对象系统 | libglib2.0-dev |
| Xlib相关 | X11客户端绘图接口 | libx11-dev、libxext-dev |
| xcb相关 | X11新一代客户端接口 | libxcb1-dev及相关扩展 |
| OpenGL相关 | GPU加速GL后端选项 | libgl1-mesa-dev、libegl1-mesa-dev |
搞清楚哪些必装、哪些可选,后面配置阶段才能按需选择。比如纯离线的图像处理场景,X11和OpenGL相关依赖完全可以不装,对应配置选项直接关掉即可。桌面窗口渲染场景则恰恰相反,字体和X11相关一个都不能少。
2. 环境准备:工具链、系统依赖与pixman的处理方式
2.1 底层编译工具链
任何源码编译工作,第一步都是确认基础工具链在位。Ubuntu下最简单的方式是安装build-essential,这个元包会把gcc、g++、make等基础工具全部拉进来。随后是Meson和Ninja,这两个是cairo 1.18系列构建的核心。
sudo apt update sudo apt install build-essential meson ninja-build pkg-configUbuntu系统仓库里的Meson版本有时候偏旧,而新版cairo的Meson脚本会用到一些较新的函数特性。假若你用的是24.04这种较新发行版,系统自带Meson基本够用。老发行版强烈建议用Python的pip安装一个更新版本,避免不必要的兼容性问题。
pip3 install --user meson ninja这里有个细节:pip install meson安装的版本通常会覆盖系统版本,但前提是~/.local/bin在PATH中排在了/usr/bin前面。安装完用meson --version验证一下,确认用的是哪一份。实测中因为Meson版本过低导致cairo配置失败的情况并不少见,多数报错信息还很隐晦,干脆直接上最新版省心。
2.2 系统依赖包一键安装
工具链就位后,需要把编译cairo所需的开发库都装上。用下面这条命令一次性装齐桌面环境的常见依赖组合:
sudo apt install \ libpixman-1-dev \ libfreetype-dev \ libfontconfig-dev \ libpng-dev \ libjpeg-dev \ libglib2.0-dev \ libx11-dev \ libxext-dev \ libxcb1-dev \ libxcb-render0-dev \ libxcb-shm0-dev \ libgl1-mesa-dev \ libegl1-mesa-dev不要用缺少-dev后缀的运行时库来凑数,开发头文件和运行库是两码事。编译过程中最重要的其实是头文件(比如pixman-1.h、cairo.h这些),以及pkg-config用来查依赖信息的.pc文件,这些只有-dev包里才有。
不同Ubuntu版本包名可能有细微变化。比如某些老版本里freetype的开发包叫libfreetype6-dev,新版本叫libfreetype-dev。装的时候如果提示找不到包,用apt search libfreetype看看到底叫什么名字,不必死等上面这份清单。
2.3 pixman的版本与源码处理
pixman是cairo最亲密的伙伴,两者版本有配套关系。多数情况下系统仓库自带的pixman开发包就能满足需求,但也有一些例外。
我在某个老嵌入式系统上遇到过:系统仓库里的libpixman版本停留在0.34,而新cairo要求pixman最低0.40左右,直接配置时报出类似Could not find a version of pixman的错。解决办法是从freedesktop的pixman发布页下载对应源码,手动编译安装更高版本。
wget https://cairographics.org/releases/pixman-0.42.2.tar.gz tar xzf pixman-0.42.2.tar.gz cd pixman-0.42.2 ./configure --prefix=/usr/local make -j$(nproc) sudo make install sudo ldconfigpixman也是autotools构建,三步走即可。需要注意装到/usr/local后,cairo的Meson系统不一定自动知道头文件去了哪里。如果cairo配置阶段仍报找不到pixman,需要设置PKG_CONFIG_PATH指向pixman的.pc文件所在目录。
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH这个环境变量贯穿整个编译过程,建议直接写进当前shell环境,避免配置阶段被找不到依赖的问题反复打断。
2.4 环境变量与pkg-config的坑
pkg-config是Linux下查找依赖库的关键工具,cairo的构建系统靠它来探测依赖是否存在、版本是否满足。安装完所有依赖后,先用一组命令做快速自检:
pkg-config --exists pixman-1 && echo "pixman ok" pkg-config --exists freetype2 && echo "freetype ok" pkg-config --exists fontconfig && echo "fontconfig ok" pkg-config --exists glib-2.0 && echo "glib ok"任何一项没有输出ok,说明对应依赖的开发包没装到位,或者PKG_CONFIG_PATH没有包含对应.pc文件路径。这一步排查价值极大,比装了依赖后闷头编译再被报错要高效得多。
还要警惕系统里有多个版本的同一个库。比如手动编译安装了新版本pixman后,系统目录里可能同时存在老版本和新版本。pkg-config --modversion pixman-1能把当前解析到的版本号打出来,务必确认解析到的是你想要的版本。另一个容易混淆的是自己编译的库和系统库混用,在接下来的编译和后续链接阶段都可能引发一系列诡异问题,干脆统一走/usr/local路径。
3. 完整编译流程:下载源码、Meson配置、编译安装
3.1 源码下载与目录规划
cairo官方发布包托管在freedesktop的cairographics.org发行目录下。文件名很规律,形如cairo-1.18.2.tar.xz。
mkdir -p ~/build cd ~/build wget https://cairographics.org/releases/cairo-1.18.2.tar.xz tar xJf cairo-1.18.2.tar.xz cd cairo-1.18.2编译前先规划安装前缀。默认情况下Meson会把产物安装到/usr/local,对自编译的第三方库来说这是合理的默认值,既不会污染系统仓库管理的/usr目录,又能在头文件和库搜索路径中被自动找到。对于跨平台交付,也可以选择自定义前缀如/opt/cairo,但这样后续pkg-config查找要额外配置路径,建议普通场景统一用/usr/local。
3.2 Meson配置命令详解
cairo 1.18采用Meson之后,配置命令变得更简洁了。进入源码目录执行:
meson setup build \ --buildtype=release \ -Dprefix=/usr/local \ -Dtests=false \ -Dfreetype=enabled \ -Dfontconfig=enabled \ -Dpng=enabled \ -Djpeg=enabled \ -Dglib=enabled \ -Dxlib=enabled \ -Dxcb=enabled \ -Dgl=enabled这里逐个解释每个选项的意义,后面按需调整时才知道哪些能关、哪些不能关。
--buildtype=release:明确生成优化后的发布版本,同时关闭debug相关的信息输出。对构建体积和运行时性能都有好处。-Dprefix=/usr/local:指定安装目录前缀,影响后续pkg-config的默认检索范围。-Dtests=false:关闭测试程序构建。cairo的测试套件本身很庞大,编译一次非常耗时,非开发场景可以直接关掉。-Dfreetype=enabled和-Dfontconfig=enabled:字体支持。文字渲染场景必须开启,纯图像场景可选关。-Dpng=enabled和-Djpeg=enabled:图像表面读写支持。需要把渲染结果输出为图片文件时开启。-Dglib=enabled:glib集成,一般保持默认。-Dxlib=enabled和-Dxcb=enabled:X11平台后端。需要绘制到X窗口时务必开启,纯离屏渲染可以考虑关闭。-Dgl=enabled:OpenGL加速后端。硬件加速场景开启,无GPU环境或用不着的场景关掉还能省些依赖。
需要说明的是,Meson对依赖的检测是自动的。比如freetype、fontconfig、png这些选项配了enabled,如果对应依赖没装好,配置阶段会直接报错,不会悄悄降级。这样反而省心,问题暴露得越早越容易查。
假如纯粹做离屏渲染,不跟X Window打交道,可以改成:
meson setup build \ --buildtype=release \ -Dprefix=/usr/local \ -Dtests=false \ -Dxlib=disabled \ -Dxcb=disabled \ -Dgl=disabled这样最终的库对X11相关依赖的引用会少很多,动态库的依赖关系也更为简单。
3.3 编译与安装
配置完成后,直接调用ninja并行编译:
ninja -C build -j$(nproc)这里-C build指定在build目录下执行构建,-j$(nproc)利用全部CPU核心并行编译,速度会快不少。cairo整个项目不大,依赖齐全的情况下,八核机器上通常一两分钟内就能编译完。
编译过程输出信息比较多,如果中途报错不要急着清屏,向上翻看日志,找到包含error:或Error字样的行。常见编译错误大多集中在头文件缺失、类型不匹配和链接失败这三类。第四部分会对典型问题做专项整理。
编译成功后安装:
sudo ninja -C build install sudo ldconfigldconfig这一步很容易被忽略。动态链接器不会主动感知新安装到/usr/local/lib的库文件,不刷新可能导致运行时找不到libcairo.so.2。刷新之后,系统才正式识别这个新库。
安装完成后可以顺手检查一下库文件是否就位:
ls -l /usr/local/lib/libcairo.*正常情况下能看到动态链接库libcairo.so和静态库libcairo.a同时出现。
3.4 静态库编译与链接注意事项
如果你最终需要的是静态库,默认的release编译已经会生成libcairo.a文件。但静态库链接进最终产品时,有几个额外需要注意的地方。
第一是依赖顺序。cairo本身是个比较大的图形库,但很多符号还是依赖于freetype、fontconfig、pixman等外部库。最终链接时,-lcairo必须放在引用cairo符号的目标文件后面,且其他依赖库也要一并出现在命令中,比如:
gcc demo.c -o demo \ -lcairo -lfreetype -lfontconfig -lpixman-1 \ -lpng16 -ljpeg -lz -lm静态链接时顺序敏感,原则是依赖库排在被依赖库前面,反复调整直到所有符号都能找到。
第二是编译选项配合。如果静态库最终要嵌入体积敏感的产品,建议编译cairo时也加-ffunction-sections -fdata-sections这类选项,并在最终链接时开启--gc-sections,把未被引用的函数段剔除。Meson里通过-Dc_args参数可以传递编译器选项:
meson setup build \ --buildtype=release \ -Dtests=false \ -Dc_args="-ffunction-sections -fdata-sections"这样生成的静态库每个函数都是独立段,链接时配合-Wl,--gc-sections能削减不少死代码。
第三是潜在的系统库混用问题。静态库会把所有代码打包进去,如果同时链接了系统自带的其他版本库,可能导致符号冲突。这类问题极其隐蔽,表现为运行结果怪异且无报错。建议静态链接前用nm -A /usr/local/lib/libcairo.a | grep 冲突符号做个快速检查,有异常早发现。
4. 编译与使用中的常见问题排查实录
4.1 找不到pixman-1.pc
这个问题算是cairo编译新人遇到概率最高的。报错信息通常是:
Run-time dependency pixman-1 found: NO或者更直白地提示pixman版本不满足。根本原因一般有两个:pixman开发包没安装,或者pixman安装在非系统默认路径下。
排查方法很直接。先确认pixman是否已安装:
pkg-config --modversion pixman-1没有输出就说明缺包,参考前文用apt或源码装好。若输出版本过低,则说明系统中pixman版本跟cairo要求不匹配,手动编译新版并设置PKG_CONFIG_PATH。
设置了PKG_CONFIG_PATH后依然报错,再检查路径是否包含lib/pkgconfig上下文。.pc文件一般在/usr/local/lib/pkgconfig,而不是/usr/local/pkgconfig。不少手动编译场景下,头文件去了/usr/local/include,.pc文件去了/usr/local/lib/pkgconfig,两个目录都要确认。
从实际经验看,90%的pixman问题都是因为不熟悉pkg-config机制导致路径没走对。务必要明白Meson、pkg-config、.pc文件三者之间的关系,排查思路才能直达痛点。
4.2 动态加载时提示libcairo.so.2找不到
编译一切正常,但运行自己的测试程序时却报:
error while loading shared libraries: libcairo.so.2: cannot open shared object file: No such file or directory这说明程序编译链接阶段找到了库,但运行时动态链接器没有找到。原因在于自编译的cairo往往安装在/usr/local/lib,而程序运行时的动态库搜索路径不一定包含这个目录。
解决方式有几种。最基础的是配置动态库搜索路径:
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH ./your_program如果希望系统范围内生效,在/etc/ld.so.conf.d/下新建一个文件,把/usr/local/lib写进去,然后刷新缓存:
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/local-libs.conf sudo ldconfig这里推荐最后一种做法,一劳永逸且不会污染已有配置。但嵌入式或交付场景建议优先考虑编译期就用-Wl,-rpath,/usr/local/lib预置运行路径,避免部署时依赖外部环境。
4.3 链接时报undefined reference to未定义符号
这类错误多在链接自己程序时出现。典型信息是:
undefined reference to `cairo_image_surface_create'看似奇怪,cairo的函数怎么找不着?实际原因大多是链接库的顺序不对,或者链接的cairo库文件不完整。
静态链接顺序前面已经说过,把-lcairo排在源文件或目标文件后面,并把cairo的依赖依次列在后面。动态链接相对没那么敏感,但如果链接时指定的库路径不干净,也可能找到别的版本。
还有一种情况是用了错误的cairo头文件。比如系统仓库的cairo.h在/usr/include/cairo,而自编译的在/usr/local/include/cairo,如果编译命令中没有用-I/usr/local/include/cairo指定,并同时带入自编译库路径,编译器虽然能通过,链接却可能定位到系统其他版本上。最终表现就是接口参数对不上,链接报错。这类多版本污染的排查也简单:pkg-config --cflags --libs cairo看下到底指向哪些路径,保证命令里的-I和-L都指向同样的前缀。
4.4 Meson配置报错:deprecated or unknown options
新版cairo的Meson配置选项比旧版有变化。网上很多教程还在写-Dwith-xlib=yes这种旧式autotools风格选项,拿到Meson里自然报错。
遇到这种情况,别急着照抄命令。在源码目录执行:
meson configure build之后会列出全部支持的配置项和当前值。结合选项清单逐一设置即可。例如显示相关后端,新旧选项对照是:
| 功能描述 | 旧式autotools选项 | 新版Meson选项 |
|---|---|---|
| Xlib后端 | --with-x | -Dxlib=enabled |
| XCB后端 | --with-xcb | -Dxcb=enabled |
| OpenGL后端 | --with-gl | -Dgl=enabled |
| 构建测试程序 | --enable-test-surfaces | -Dtests=true |
遇到报错先执行meson configure查看可用选项,错误率会大幅下降。
4.5 编译时内存不足或并行进程过多
Ninja并行编译默认很激进,小内存机器上容易导致OOM。尤其像cairo这种库,源码文件多,每个编译单元吃内存也不小。不少开发板只有1GB内存,-j$(nproc)一跑,gcc瞬间吃爆内存直接被杀掉。
这类问题的处理方式是控制并行度,不要盲目用满核心数。
ninja -C build -j2还可以显式限制每个编译进程的资源占用。在Meson中设置-Dbackend_max_links之类选项,限制链接阶段并发数量,也能减少内存尖峰。根据实际经验,四核机器用-j4通常没有问题,而单核机器强制-j1反而更稳。
4.6 新装系统缺少基础库头文件
有些精简过的Ubuntu发行版,装完只有build-essential,其他开发头文件一概没有。编译cairo时,报错通常多种多样:
fatal error: ft2build.h: No such file or directory fatal error: png.h: No such file or directory这背后指向的是freetype和libpng的开发包没装。按前面章节的命令把libfreetype-dev、libpng-dev这些装上即可。
这里也顺带提醒,某些轻量容器镜像或CI环境会连pkg-config和meson都没有。建议在编译前先跑一条检查命令,把工具链一次性备齐:
which gcc g++ pkg-config meson ninja5. 验证安装结果与后续使用建议
5.1 基础验证:版本号与依赖关系
编译安装完成后,验证不能只满足于make install无报错。第一步,用pkg-config确认版本号符合预期:
pkg-config --modversion cairo正常输出形如1.18.2。如果输出的还是系统老版本,说明PKG_CONFIG_PATH或者环境变量有问题,自编译的.pc文件没有进入pkg-config的搜索路径,需要检查/usr/local/lib/pkgconfig/cairo.pc是否存在。
第二步,查看动态链接库实际解析路径:
ldconfig -p | grep libcairo输出中应能同时看到libcairo.so.2以及新的安装位置。如果同时存在/usr/lib/x86_64-linux-gnu/libcairo.so.2和/usr/local/lib/libcairo.so.2,就要明确后续链接到底使用哪个版本。
第三步,写一个最小验证程序,确认功能可用。用文本编辑器创建一个demo.c:
#include <cairo.h> #include <stdio.h> int main(void) { cairo_surface_t *surface; cairo_t *cr; surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 320, 240); cr = cairo_create(surface); cairo_set_source_rgb(cr, 0.1, 0.6, 0.9); cairo_rectangle(cr, 20, 20, 280, 200); cairo_fill(cr); cairo_surface_write_to_png(surface, "output.png"); cairo_destroy(cr); cairo_surface_destroy(surface); return 0; }编译链接执行:
gcc demo.c -o demo `pkg-config --cflags --libs cairo` ./demo执行后目录下应有output.png生成,用图片查看器打开后能看到一个左上角距离边缘20像素的蓝色圆角矩形。图像验证是流程闭环的关键一步,能确认不只是编译配置正确,实际渲染也确实可用。
5.2 切换系统库与自编译库
如果系统里原本就有cairo,自编译的新版本安装到/usr/local后,动态链接优先顺序是:程序编译时指定的-rpath、LD_LIBRARY_PATH环境变量、系统缓存/etc/ld.so.cache。也就是说,在LD_LIBRARY_PATH包含/usr/local/lib时,程序会优先加载自编译版本,但要显式设置才有效。
实际操作中两种切换方式:
- 全局环境:
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH,适合临时切换或调试。 - 编译期固定:
-Wl,-rpath,/usr/local/lib,把运行路径写死进二进制,适合交付给其他机器运行。
如果长期自编译cairo为主,建议从系统包管理层面把自带版本卸载或标记为自动安装,避免两套开发包五元混杂。不过真的要动系统包,务必谨慎操作,先确认桌面应用没有立即依赖它们。
5.3 交叉编译场景下的额外配置
嵌入式或异构平台的交叉编译需求,在cairo这种底层库上也很常见。交叉编译跟本地编译流程上类似,多了一件关键道具:交叉编译配置文件。
Meson通过--cross-file参数传入交叉配置,文件内容大致如下:
[binaries] c = 'arm-linux-gnueabihf-gcc' cpp = 'arm-linux-gnueabihf-g++' ar = 'arm-linux-gnueabihf-ar' strip = 'arm-linux-gnueabihf-strip' pkgconfig = 'arm-linux-gnueabihf-pkg-config' [host_machine] system = 'linux' cpu_family = 'arm' cpu = 'armv7' endian = 'little'关键点是pkgconfig工具路径必须指向交叉工具链自带的版本,并且需要把目标平台的库搜索路径加到PKG_CONFIG_PATH里,否则Meson探测到的还是宿主机的依赖。没有现成交叉pkg-config时,可以创建一个包装脚本,把PKG_CONFIG_LIBDIR指到目标平台的.pc目录。
交叉编译cairo的目标平台依赖往往要比宿主机复杂,字体、X11等组件的交叉版本很难一次凑齐。建议先从离屏功能开始配置,精简到freetype=disabled等最小编译集合,确认编译链路通畅后再逐项打开所需后端,排查问题的复杂度会降很多。
5.4 后续升级与版本维护经验
cairo是那种很底层的库,但也不是编译完彻底不管了。后续维护有两点经验值得记下。
第一,升级cairo前,从源码包里先跑一遍配置和编译,看依赖版本是否满足。比如新版本对fontconfig、pixman的最低版本要求往往有所提升。不要跳过这一步直接安装,容易把系统弄成半新半旧的状态。
第二,注意全局的库替换风险。不少桌面组件都跟cairo有依赖关系,直接覆盖系统自带的cairo可能导致原有程序行为变化。如果只是解决某个具体项目,最稳妥的是自编译库安装到独立前缀(比如/opt/caironew),然后在项目构建脚本里用PKG_CONFIG_PATH指过去。这样既能使用新特性,又不影响系统现有程序。
第三,自编译库的文件备份。/usr/local/lib下的libcairo.*文件、/usr/local/include/cairo头文件以及/usr/local/lib/pkgconfig/cairo.pc,这三处构成了完整的安装产物。迁移环境时打包这三类文件即可,不必重新回去下载源码编译。我在多个设备间同步环境时就靠这个方式,省了不少时间。
从实际的构建次数看,cairo编译本身是一次性工作,真正的难点都在依赖和路径的排查上。把pkg-config机制理顺、把Meson选项和依赖对应关系搞清楚,后面无论切平台、换版本还是裁剪功能,基本都能做到有条不紊。