glib库是一个纯C库,源于GIMP,它是GIMP、GTK/GTK+以及GNOME等的基石库,在Linux下起作举足轻重的作用。对于学习C语言及数据结构,glib库也是一个非常不错的选择。在学习的过程中如果能够调试代码,将会对代码有更直观的理解。

glib库在早期是使用configure脚本程序生成Makefile来构建的,在2008年的时候,也有添加VS工程。在2.53.4版本中正式添加了meson相关文件,可以使用meson来构建项目了,不过依然保留着脚本方式生成Makefile和VS工程。不过从2.59.1版本开始,不再提供脚本方式生成Makefile,也不再提供VS工程了,只保留了meson的构建方式。

C/C++的构建方式经历了几次变革后,目前比较流行的上层构建方式是cmakemesoncmake生态比meson要好很多,基本上主流的IDE的都支持cmake,比如VS2022VSCodeQtCreatorCLion等等,并且很多IDE都支持调试cmake的配置文件CMakeLists.txt,所以cmake的知名度也比meson要大很多(笔者也是先知道、学习、使用CMake,而没用过meson);而meson官方宣传说快速构建,据说也有很多开源代码转向meson,但基本上还没有比较好的IDE支持,虽然VSCode有一个插件,但是成熟度还不够,目前打开glib都成问题。

为了调试glib库,就需要使用meson将之生成为具有调试信息的debug版本。以下命令全部都是在Windows下的MinGW终端中输入的。

一、直接生成Ninja文件

1. 配置

1 meson setup build --prefix ${PWD}/install --buildtype debug --reconfigure

各参数含义如下:

  • build 指定构建的输出目录
  • –prefix ${PWD}/install 指定安装目录,建议将自行构建的调试版本安装在源码所在的某个目录中,这里是install目录
  • –buildtype debug 指定构建类型,编译成调试版本为debug,可以指定的类型:plain,debug,debugoptimized,release,minsize,custom,默认为debug
  • –reconfigure 如果build目录中之前有配置过,则需要指定--reconfigure强制重新配置

2. 编译

使用命令

1meson compile -C build

或者

1ninja -C build

编译项目。

3.安装

1meson install -C build

安装目录为之前配置的${PWD}/install,即源码目录下的install目录。

将安装目录bin下生成的DLL,复制在要调试的程序的工作目录,否则会调用到MinGW中的DLL。

在这里插入图片描述 由于目前没有IDE支持meson,所以这种方式不能直接使用glib中的测试用例进行调试,需要自行创建CMake项目,把测试代码复制过来生成。

二、生成基于Ninja的VS2022的项目文件

meson也支持生成vslite的项目,目前默认是VS2022:

1 meson setup vs2022 --buildtype debug --genvslite vs2022

这样会生成如下几个目录:

在这里插入图片描述 vs2022_vs目录下可以看到glib.sln解决方案文件:

在这里插入图片描述

使用VS2022打开后,进行构建,其实质还是使用的Ninja来编译的,需要使用到MinGW环境。

这样构建好后,理论上是可以运行glib自带的测试用例,但是实际上还是有点问题,不能直接进行调试。拿gobjectoverride测试项目为例,需要设置调试器的参数:

在这里插入图片描述

设置好后,同样需要将生成的调试版本的DLL(libglib-2.0-0.dlllibgobject-2.0-0.dlllibgio-2.0-0.dlllibgmodule-2.0-0.dlllibgthread-2.0-0.dll)根据需要复制到工作目录下。由于VS2022使用的是自己的调试器,而非GDB或者LLDB,所以调试时可能会不能步进进入glib的函数调用的源码中(笔者测试下来是不能进入的),需要先在其中打断点。

三、生成基于MSBuild的VS2022项目文件

前面使用--genvslite参数生成的VS2022项目是基于MinGW开发环境的,需要安装MinGW环境。要想生成使用微软C/C++编译器编译的纯VS2022的项目文件,可以使用下面的命令:

1meson setup vs2022 --backend vs2022

使用--backend参数指定类型,目前支持的类型为:ninja,vs,vs2010,vs2012,vs2013,vs2015,vs2017,vs2019,vs2022,xcode,none,默认为ninja

在这里插入图片描述

这种方式需要自行安装依赖,glib库依赖libffi,否则会报错: 在这里插入图片描述 glib库的meson是有配置相关依赖的,只是需要添加subproject命令来强制下载并生成依赖,修改根目录下的meson.build文件: 在这里插入图片描述

由于meson命令是在MinGW终端执行的,MinGW安装了pcre2库,所以会找到MinGW的库:

在这里插入图片描述 这里版本不对,会出现错误,需要使用subproject下载的版本,所以需要屏蔽掉:

1pcre2 = dependency('libpcre2-8', version: pcre2_req, required: false, allow_fallback: false)

使用:

1pcre2 = dependency('libpcre2-8')

而2067行elif host_system == 'windows'到2078行也需要屏蔽掉,否则meson会报错:

1ERROR: Dependencies must be external dependencies

网上有报meson的BUG,但是还未解决。

现在执行:

1meson setup vs2022 --backend vs2022  --buildtype debug --prefix ${PWD}/install --reconfigure

可以看到pcre2的版本使用的是subprojects下的了:

在这里插入图片描述

再看概览:

在这里插入图片描述

在vs2022目录下的生成了VS2022的解决方案文件glib.sln,现在可以使用它来编译测试用例了。还是以GOjbect下的override测试用例为例,它之设置为启动项目,然后只编译它,会自动编译所有依赖项,完成后将生成的DLL复制到override.exe所在的目录,就可以调试了。 在这里插入图片描述 这里是使用的VS的本地调试器,所以比之前的调试体验都要好!

记录不易,如果对你有帮助,欢迎点赞收藏!