拓冰建站拓冰建站
首页 / 资讯中心 / 正文

openSUSE Leap 15.6下用GNOME Builder创建Meson空白工程指南

这几年我一直在陆陆续续整理 openSUSE 上启用 GNOME Builder 的实操记录。之前写过的两篇一篇偏安装和整体界面一篇聚焦了工程管理的基本用法很多朋友反馈说“界面看懂了但真正要从零开一个工程还是懵”。所以这一篇我干脆就把“用 GNOME Builder 45.0 创建一个空白 Meson 工程”这件事拆到最细从系统环境确认、模板选择到手把手构建运行再到生成出来的文件到底是什么、每个文件有什么用、过程中容易出哪些问题、怎么排查。整个流程我在 openSUSE-Leap-15.6-DVD-x86_64 上重新走了一遍跟着这篇文章做基本不会卡壳。1. 为什么我在 Leap 15.6 上坚持用 GNOME Builder Meson 这套组合先说一个很多人问过的问题GNOME Builder 本身只是个 IDE它支持很多语言和构建系统为什么我非要选 Meson又为什么要在 openSUSE Leap 15.6 这种相对保守的发行版上用原因有三层。第一层GNOME Builder 对 Meson 的支持是原生级别的。你新建工程时Builder 会直接调用 meson init 这类后端逻辑帮你生成文件打开工程时它又能自动解析 meson.build不需要你手动配置“构建命令”和“安装命令”。这跟手动写一个 Makefile 再用“自定义构建”的方式完全不同整个开发循环是跑在同一个语义体系里的。与此相对如果用 CMakeBuilder 虽然也支持但很多辅助功能比如自动补全的编译参数、调试时的运行目标映射明显不如 Meson 顺滑。第二层openSUSE Leap 15.6 默认软件源里带的就是 GNOME Builder 45.0而 Builder 45 这个版本对 Meson 的适配刚好很成熟。Builder 45 用的是 libide 基础库构建流水线也接受了比较多的重构在建工程、建会话、管理运行时这些操作上比 43、44 要顺手。尤其在新工程向导里Meson 相关选项排布很清晰适合拿来当入门模板。第三层也是我实际体会最深的一层Meson 对“系统里可能同时存在多个工具链”的场景处理得比很多构建系统更省心。openSUSE 默认的 GCC 版本、Python 版本以及 Builder 自带的 Clang 分析器、Flatpak 运行环境这些都可能在同一个系统里共存。Meson 的交叉编译和“原生文件native file”机制可以很明确地指定“我这次构建到底用谁”不会出现“明明改了环境变量构建时却还是用了另一个编译器”这种玄学问题。对于刚接触 Linux 桌面开发的朋友来说这套组合还有一个额外的好处你在 Builder 里看到的工程结构和你用命令行执行meson setup builddir看到的工程结构是同一个东西。你在 Builder 里学会的概念拿到 CI、拿到纯命令行环境里一样能用不会被 IDE 的封装绑架。2. 环境准备确认 openSUSE-Leap-15.6 与 Builder 45.0 的对应关系在真正点“新建工程”之前先把系统环境确认清楚。别小看这一步很多人在 Builder 里折腾半天构建失败最后发现是系统里缺了 meson 的运行时或者 Builder 版本不对菜单选项都对不上。2.1 openSUSE Leap 15.6 的安装与桌面选择我用的介质是openSUSE-Leap-15.6-DVD-x86_64.iso也就是官方 DVD 版本x86_64 架构。安装时桌面环境选的是 GNOME。这一点比较关键虽然 Builder 本身可以跑在其他桌面上但如果你用的是 KDE 或 Xfce系统的主题、Portal 服务、输入法这些环境变量会不一样容易出现“Builder 启动正常但 CtrlShift空格呼不出补全”这类界面层问题。用 GNOME 桌面可以减少一个变量。安装完系统后第一件事是把系统更新到最新sudo zypper refresh sudo zypper updateLeap 15.6 的软件源分为 oss、non-oss、update 等部分默认安装后 update 源是启用状态。执行更新时如果提示某个源失效就用zypper repos --uri检查一下源地址是否对。2.2 安装 GNOME Builder 与 meson在 openSUSE 上安装 Builder 很简单sudo zypper install gnome-builder但这里有个容易忽略的点gnome-builder 这个包在 Leap 15.6 上不一定会把 meson 作为硬依赖拉进来。Builder 内部对 Meson 的支持是通过调用系统的meson命令来实现的所以如果你系统中没有独立的 meson 包新建 Meson 工程时会卡在“初始化模板”那一步。建议显式安装sudo zypper install meson ninjaninja是 Meson 默认的后端构建工具。Builder 45 里构建工程时默认走的就是 Ninja。有些教程会让你再装pkgconf、gcc、gdb这些在安装系统时如果选了“开发工具”模式一般已经带了。稳妥起见一次性确认sudo zypper install gcc gcc-c gdb pkgconf glib2-devel安装完成后从活动界面启动 GNOME Builder在欢迎页左下角或顶部菜单“关于”里确认版本号是 45.0。如果系统里装的是别的版本后面菜单名称和选项位置会有差异操作时以自己看到的界面为准。2.3 确认命令行的 meson 版本Builder 新建 Meson 工程时对 meson 版本是有下限要求的。Builder 45.0 内部使用的 Meson 后端要求不低于 0.59建议装 0.60 以上。用下面的命令确认meson --versionLeap 15.6 源里的 meson 版本是 0.63 左右完全够用。如果你发现版本偏低不要单独去 meson 官网下 tar 包覆盖系统路径优先级应该是先启用 openSUSE 的 devel:tools:building 源或者通过zypper install python3-meson升级尽量避免破坏系统的 Python 依赖关系。2.4 一个关于“运行时”的前置说明Builder 45 在新建工程时会问你“运行时”是选系统运行时还是 Flatpak 运行时。系统运行时直接使用你当前 Linux 发行版里的库和工具链。比如用/usr/bin/gcc、系统的 glibc、系统的 GTK 库。好处是快、直接、不占额外空间坏处是如果系统里缺某个开发库编译时会报找不到头文件。Flatpak 运行时Builder 会自动拉取一个独立的 SDK 容器在这个容器里编译和运行。好处是依赖隔离坏处是首次要下载几百 MB 的运行时而且如果网络不好很容易失败。openSUSE 的软件源里自带 GNOME SDK 相关的 Flatpak 运行时不一定完整。如果你是刚入门建议第一遍创建工程时选“系统运行时”把流程跑通后再去折腾 Flatpak。3. 创建空白 Meson 工程完整操作路径与关键选项解读环境确认完下面进入正题。打开 GNOME Builder在欢迎页点“新建”或者从左上角汉堡菜单选“新建工程”。此时会进入新工程向导第一步就是让你选语言、工程类型、构建系统这些选项。3.1 工程模板界面里每一项到底是什么意思Builder 45 的新工程向导分为几个区块。左边是工程模板列表中间是工程配置右边可能还有预览区。我直接把每个关键选项解释一遍语言LanguageGNOME Builder 支持 C、C、Rust、Python、Vala 等。选 C 或 C 时生成的是 msvc/gcc 风格的项目结构选 Python 时通常生成的是基于 Meson 的 Python 工程选 Rust 时则为 cargo 风格或 Meson 风格。工程类型Project Type有“空白工程”“GTK 窗口工程”“终端程序工程”等。这决定模板里是否包含图形界面相关代码、是否引用 GTK 库。我这次选“空白工程Empty Project”不希望模板自动生成窗口代码方便后面自己从零搭结构。构建系统Build System有 Meson、CMake、AutotoolsAutotools 在 45 里有时显示为“Autotools”、单一命令Single Command等。这里选Meson。如果你选的是 C 语言并且选了空白工程Meson 是默认推荐。工程名Project Name这是你的工程标识Builder 会自动把它变成文件名前缀。比如你填hello-builder生成的主源码文件可能是hello-builder.cmeson.build 里的project()名称也会是hello-builder。文件名前缀File Name Prefix这个字段可能出现在高级选项里用来控制生成源码文件的名字。默认等于工程名一般不用改。运行方式Run Type有些版本会问你是“命令行程序”还是“图形程序”。空白模板通常默认是命令行程序。我在实际操作中填的信息是选项我填的值语言C工程类型空白工程构建系统Meson工程名blank-meson-demo文件名前缀blank-meson-demo运行时系统运行时填完后点击“创建”。这里有个细节如果 Builder 的“创建”按钮是灰色不可点的优先检查工程名里是否有空格或特殊符号。工程名会被用于生成目录名和 meson 工程名建议只用小写字母、数字、连字符。3.2 创建后工作区里出现了什么创建完成后Builder 会自动打开新工程左侧是文件列表。你会看到这样一个基本结构blank-meson-demo ├── .gitignore ├── .vscode/ # Builder 45 有时生成此目录 ├── .flatpak-builder/ # 仅当选 Flatpak 运行时才有 ├── README.md ├── meson.build ├── meson_options.txt # 空的工程可能没有 └── src ├── blank-meson-demo.c └── meson.build注意空白 Meson 工程并不等于“什么都没有”。Builder 的模板会生成最小的 Meson 工程骨架但不会自动生成 GTK 界面。这点和“GTK 窗口工程”模板有本质区别。如果你的工程名是blank-meson-demo那么src/blank-meson-demo.c通常是一个最简的 C 程序一般是#include stdio.h int main(int argc, char *argv[]) { g_autoptr(GError) error NULL; return 0; }不同小版本生成的代码略有差异有的模板甚至会生成一个简单的 “Hello, world” 打印。如果你打开发现是空的main函数不用慌这正符合“空白工程”的定位——它只是给你一个能编译、能运行的起点。3.3 这里为什么不选 “GTK 窗口工程”很多人第一次用 Builder习惯选“GTK 窗口工程”因为觉得“能看到一个窗口”才像图形 IDE。但如果你只是想先搞懂 Meson 的工程组织我建议从空白工程开始。原因是GTK 工程模板会自动引入gtk4或gtk3依赖如果你系统里没有对应版本构建会立刻失败。而空白工程只依赖最基本的 libc构建失败的概率小很多适合用来验证“Builder Meson Ninja”这条链路是否通。等空白工程跑通了再回到模板向导新建一个 GTK 工程你会发现那些因为缺依赖而报错的问题基本都是同一类问题处理起来心里有数得多。4. 生成的 meson.build 到底在说什么逐行拆解与最小知识点Meson 工程的核心是meson.build文件。很多新手看到它第一眼就懵因为语法既不像 shell也不像 Makefile。但实际上它的结构非常简单尤其空白工程的meson.build一共就十几行。我强烈建议不要跳过这一节因为后面你改工程名、加依赖、加库文件全都要碰这个文件。4.1 根目录 meson.build用 Builder 打开工程后双击根目录的meson.build。通常内容类似project(blank-meson-demo, c, version : 0.1, meson_version : 0.59, default_options : [warning_level2])这段的意思是project声明工程名、语言、版本。meson_version声明构建时需要的最低 Meson 版本。default_options可以加默认编译选项比如这里的warning_level2意味着编译时开启更多警告。接着你会看到类似subdir(src)这行告诉 Meson 进入src子目录读取src/meson.build。这是 Meson 常用的组织方式根目录只负责全局配置实际的可执行文件定义都放在子目录。4.2 src/meson.build进入src目录后打开src/meson.build可能的布局是executable(blank-meson-demo, blank-meson-demo.c, install : true)这里executable()是 Meson 最核心的函数声明一个可执行文件。第一个参数是目标名第二个参数是源文件列表install : true表示构建后可以通过meson install安装到系统。如果你后面想加第二个源文件直接改这里executable(blank-meson-demo, blank-meson-demo.c, another-source.c, install : true)如果工程需要链接某个库比如数学库libm则加一行executable(blank-meson-demo, blank-meson-demo.c, install : true, link_with : some_library)但注意直接链接数学库更常用的写法是cc meson.get_compiler(c) m_dep cc.find_library(m, required : false) executable(blank-meson-demo, blank-meson-demo.c, dependencies : m_dep, install : true)这段代码看起来有点复杂但背后的逻辑很简单先拿到 C 编译器对象告诉它“帮我找一下 libm”然后把找到的库作为依赖传给 executable。Meson 的dependencies参数非常常用几乎任何第三方库的接入都会走这个机制。4.3 meson_options.txt 存在的意义如果你的工程是 Builder 45 生成的根目录可能没有meson_options.txt。这个文件专门用来声明自定义构建选项。默认模板不生成它只有当你需要比如-Denable_teststrue这类开关时才手动创建。在 meson.build 里可以用option(enable_tests, type : boolean, value : false)来声明但更规范的做法是写进meson_options.txt然后在 meson.build 里用if get_option(enable_tests) subdir(tests) endif这样工程结构会更清晰后续加测试、加示例、加不同的构建模式都不会把根目录文件搞成一团浆糊。4.4 .gitignore 和 README空白工程会自动生成.gitignore内容一般包括 build 目录、.flatpak-builder目录等。还有一个 README.md默认内容简短但后续写工程说明时可以直接在这里补。这里有一点要特别提醒千万不要把构建目录提交到 Git。Builder 默认的构建目录是build或_buildmeson运行时生成的文件又多又杂提交后不但没有价值还会把你真正的源码文件淹没。5. 从空白模板到可运行程序改代码、构建、运行的三步闭环工程创建出来是一回事能在 Builder 里跑起来是另一回事。下面我按“改代码—构建—运行”的顺序走一遍这段所有操作都能在 Builder 界面里完成不用开终端。5.1 把空 main 改成真正能打招呼的程序新建的空白工程里main函数是空的。我先把它改成一个最简单的程序这样可以直观验证环境#include stdio.h int main(int argc, char *argv[]) { printf(hello from blank meson project\n); return 0; }如果你打开源文件发现里面带了glib.h之类的头文件也没关系那是 Builder 模板自带的不影响本示例。但这里要注意g_autoptr这类 GLib 宏如果系统里没装 GLib 开发库编译含 GLib 头文件的代码会报错。这就是我前面建议从空白工程开始、并且优先用“系统运行时”的原因之一如果你打开的文件是空 main不涉及 GLib环境验证会更纯粹。5.2 在 Builder 中构建工程的两种方式在 Builder 45 界面右上角有个“构建”按钮图标通常是一个锤子或三角形。点击后会开始构建Builder 底部会弹出“构建”面板显示 Ninja 的执行日志。第一次构建时Builder 会自动创建构建目录并执行相当于命令行meson setup build的操作。如果你看日志会发现它先打印了一些Meson的初始化信息然后才进入编译。这个流程是自动的不需要你手动选构建目录。另一种构建方式是用快捷键默认是CtrlShiftB。我个人更推荐记住这个快捷键因为后面频繁改代码、反复构建时鼠标点按钮效率太低。构建成功时底部面板会显示类似BUILD SUCCESSFUL同时右上角的运行按钮会变成可用状态。如果构建失败面板里会直接跳转到第一个编译错误的位置点错误信息还能自动跳转到源码对应行。5.3 运行程序终端模式与集成方式构建成功后点右上角的“运行”按钮三角形图标Builder 会启动当前目标。由于这是一个纯命令行程序运行结果会显示在 Builder 底部的“终端”面板里而不是弹出一个新窗口。你会在终端面板里看到hello from blank meson project如果你的模板工程名不是blank-meson-demo而是hello-builder那运行目标会自动称为hello-builder。运行对象是哪里来的Builder 会自动从src/meson.build的executable()第一个参数里读取。也就是说只要你的 Meson 工程定义了一个可执行文件Builder 就会自动把它识别为运行目标。这种自动化程度是手动 Makefile 工程无法比拟的。5.4 修改构建目录或清理重建日常开发中我遇到过很多次“明明改了源码构建日志却显示老代码”的情况。在 Builder 中这种问题多半是因为构建目录缓存。这时最直接的办法是“清理构建目录”在 Builder 左侧或顶部找“构建”相关的下拉菜单一般有“清理”选项。如果找不到可直接在系统文件中删掉工程目录下的build文件夹或_build然后在 Builder 里重新构建。但要注意在 Builder 45 中如果你删除了构建目录重新构建时它会重新执行 meson setup这本身没问题但所需时间会更长。所以日常修改代码优先点“构建”按钮增量编译就好只有遇到诡异问题时才需要清理重建。6. 调试与运行Builder 内置调试器的实用技巧构建能跑只是第一步真正有开发经验的读者一定会关心调试器怎么用。GNOME Builder 自带 GDB 集成这一点在空白 Meson 工程里同样适用不需要额外配置。6.1 打断点与启动调试在源码行号左侧单击可以打一个红点断点。比如我在printf这一行打上断点。然后点击运行按钮旁边的“调试Debug”图标Builder 会以调试模式启动程序。程序运行到断点处会暂停此时变量面板显示当前作用域内的局部变量。如果要显示变量的内存地址或结构体成员右键变量名可以看详细值。调用堆栈显示main的调用栈这对定位崩溃特别有用。监视表达式可以自己输入表达式比如argc、argv[0]。注意 GDB 对argv[0]的解析偶尔会有问题但基础类型没问题。如果你的程序是命令行程序调试时 Builder 底部会有一个调试终端你可以在这里输入stdin数据如果程序需要读取输入。6.2 遇到段错误时的排查模板空白 Meson 工程本身很少出错但你以后往里面加代码时肯定会遇到段错误Segmentation fault。这时不要慌在 Builder 中点“调试”程序崩溃后会自动停在出错位置。通常你会在调用堆栈里看到main的某一帧点击不同帧能逐步查看错误上下文。一个小技巧如果 Builder 没能自动停到源码行而是停到了汇编窗口不要被吓到。这不是 Build 配置错了只是当前帧没有 debug 信息。点一下调用堆栈里的其他帧多半能回到源码视图。6.3 运行参数在哪里设置命令行程序有时需要传参数比如./blank-meson-demo --help。在 Builder 里设置这个参数需要打开“运行”设置。在 Builder 45 中可以右键点击顶部运行目标或者进入“运行与调试”面板在“运行参数”一栏里填上--help。填完后再次点“运行”就会自动加上参数。这一块比较容易忽略因为 Builder 默认并不会为每一个可执行文件都弹参数设置。你需要在顶部能找到一个小齿轮图标或下拉箭头点开才看得到。7. 实操中容易踩的坑与排查方法这部分我整理了在 Leap 15.6 上使用 Builder 45 创建 Meson 工程时我自己和网友遇到频率最高的几个问题。每一条都是真实踩过的不是理论推演。7.1 问题一新建工程时提示“找不到 meson”这是最常见的问题。现象是点“新建”后选好模板点“创建”Builder 底部提示类似Cannot create project: meson command not found原因我之前已经提了gnome-builder包没有自动依赖 meson。解决办法就是补装sudo zypper install meson ninja装完后完全退出 Builder 再重新启动不要只是关闭工程窗口。Builder 在启动时才会重新探测 PATH 里的 meson如果它是在启动后才装的通常要重启才能识别。7.2 问题二构建报 “Could not find a version of glib2”这个报错多半不是你选了空白工程而是 Builder 模板仍会在src/meson.build里自动引用dependency(glib-2.0)。如果你的系统没有glib2-devel包就会报Run-time dependency glib-2.0 found: NO解决办法sudo zypper install glib2-devel但更符合“空白 Meson 工程”定位的做法是手动把src/meson.build里多余的dependency()删掉或者用cc.find_library只链接自己需要的库。这样你的工程就不依赖 GLib 这个额外的库环境门槛更低。我个人的偏好是空白工程里meson.build尽量保持极简不引入任何与示例无关的依赖。这样后面无论拿到什么机器上演示都能直接构建。7.3 问题三运行按钮是灰色的构建成功后运行按钮还是灰色一般是 Builder 没能识别出可执行目标。常见原因meson.build里还没定义executable()可能你还在配置阶段。工程根目录的meson.build没有subdir(src)导致 Builder 走不到src/meson.build。构建其实失败了但你没有注意到底部日志条。解决办法先点一次“构建”看日志确认BUILD SUCCESSFUL。如果确实成功了但按钮仍然灰色就在文件列表里右键src/meson.build选择“重新加载工程”或者直接关闭工程再重新打开。7.4 问题四中文注释乱码或输入法无法输入openSUSE 的 GNOME 桌面默认启用 IBus。在 Builder 45 里中文输入通常没问题但有少数用户会碰到光标不跟字、候选词条不弹出的情况。如果在 Builder 里输入中文不顺畅不要动系统输入法先尝试把 GTK_IM_MODULE 设为gtk-im-context-simpleenv GTK_IM_MODULEgtk-im-context-simple gnome-builder这是临时测试。如果确认是输入法问题再回到系统设置里检查 IBus 是否正常运行。7.5 问题五“没有权限访问 /dev/tty”导致程序无法交互运行有时候你在 Builder 里运行一个需要终端输入的程序底部的终端面板会提示权限不足。这是因为 Builder 运行程序时某些环境下没有正确分配伪终端。常见解决办法检查启动配置里是否把运行方式设成了“无需终端”或者改一下当前运行目标为“终端模式”。如果搞不定最简单的办法是直接开一个系统终端手动执行构建产物./build/src/blank-meson-demo不要觉得这样是绕路实际上很多 Linux 开发者习惯了 IDE 内写代码、系统终端里跑程序两种方式结合效率反而更高。Builder 的终端面板只是为了方便不必要所有程序都在它里面跑。7.6 问题六修改了系统 GCC 版本后构建失败openSUSE Leap 15.6 默认 GCC 是 7 还是 8 取决于你安装的 toolchain但如果你手动添加了更高版本的 GCC比如从 Factory 源装的 gcc12Builder 可能会调用到不兼容的编译器版本。表现为编译时冒出大量internal compiler error或头文件找不到。处理方式不要跟编译器搏斗去 Builder 的“编译”设置里把“C 编译器”指定到/usr/bin/gcc。Builder 45 的工程设置里可以在“构建”选项卡下找到编译器选项手动改成你确定能用的那个。不要直接改系统默认的/usr/bin/gcc软链接那样可能破坏 zypper 的依赖管理。8. 空工程跑通后下一步能怎么扩展到这里你已经用 GNOME Builder 45.0 在 openSUSE-Leap-15.6 上创建并运行了一个最小的 Meson 工程。整条链路系统环境、Builder 模板、Meson 配置、Ninja 构建、GDB 调试都已经打通。接下来无论你是想继续做 GTK 图形应用还是纯命令行工具都有了稳定的地基。我自己的扩展经验有几点可以分享。第一一定要养成先确认工程组织再动手写代码的习惯。很多新手在单文件里写几千行最后发现要拆文件时meson.build要反复改。不如一开始就定好目录结构src/放源码subprojects/放第三方依赖tests/放测试data/放资源文件。Meson 对 subproject 的支持很好用dependency(xxx, fallback: [xxx, xxx_dep])就能优雅地引入子项目。第二善用 Builder 的“插件”与“片段Snippets”功能。Builder 45 自带很多代码片段比如在 .c 文件里输入for再按 Tab会补全一个 for 循环模板。这些模板对新手很友好能减少大量打字量。我之前写空工程示例时就靠这个快速补全了 main 函数的框架。第三把平坦的构建系统升级为带install规则的工程。Meson 里不仅支持executable还支持install_headers、install_data、gnome.compile_resources等。当你的程序需要安装桌面文件、图标、GSchema 时这些规则能保证安装后系统能识别你的应用。这个阶段可以先在 Builder 的“安装”按钮里执行一次meson install到自定义目录不要直接装到系统目录避免污染系统。第四尝试开一个 Flatpak 运行时的新工程。如果你做的是图形应用Flatpak 打包几乎是绕不开的。Builder 45 里新建工程时选 Flatpak 运行时会自动生成org.example.App.json之类的 manifest 文件。第一次需要下载运行时网络差的话会很漫长但一旦跑通后续调试和打包就非常顺。我个人建议在空工程跑通后找一个空闲时间专门试一次 Flatpak不要拖到项目后期。第五顺手学一下命令行的 Meson 用法。Builder 的图形界面能处理 90% 的日常需求但遇到复杂问题比如交叉编译、CI 构建、自定义工具链你迟早要用命令行。常用的三句话meson setup builddir meson compile -C builddir meson test -C builddir这三句话覆盖了从配置到测试的完整闭环。你在 Builder 里的操作翻译过去就是这三句话的封装。理解了这个对应关系以后不管用哪个 IDE哪怕是 VS Code、CLion你都能快速上手 Meson 工程。最后再分享一个我个人的操作习惯每新建一个 Meson 工程我都会在 README 里先写下三行内容——这个工程要解决什么问题、构建命令是什么、运行依赖是什么。Builder 45 生成的 README 是空的正好拿来填。这样做的好处是一段时间后你回来看自己的老工程不用重新读一遍源码就能恢复上下文。这个习惯我保持了很长时间帮我在各种实验性项目里省下了不少时间。到现在这个系列其实已经涵盖了 Builder 的基本操作、工程管理和 Meson 空白工程的完整实践。后面如果有时间我会接着写一篇“用 Builder 调试 GTK 应用”或者“把现有 CMake 工程迁移到 Meson 的踩坑记录”这两块也是我自己折腾了很久才搞顺的内容。如果你在做同一套环境有什么卡住的地方也可以按照这篇文章里的排查思路去定位大概率不是 Builder 本身的问题而是系统依赖或工程配置的问题。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门