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++的构建方式经历了几次变革后,目前比较流行的上层构建方式是cmake
和meson
。cmake
生态比meson
要好很多,基本上主流的IDE的都支持cmake
,比如VS2022
、VSCode
、QtCreator
、CLion
等等,并且很多IDE都支持调试cmake
的配置文件CMakeLists.txt
,所以cmake
的知名度也比meson
要大很多(笔者也是先知道、学习、使用CMake,而没用过meson
);而meson
官方宣传说快速构建,据说也有很多开源代码转向meson
,但基本上还没有比较好的IDE支持,虽然VSCode
有一个插件,但是成熟度还不够,目前打开glib
都成问题。
为了调试glib
库,就需要使用meson
将之生成为具有调试信息的debug版本。以下命令全部都是在Windows下的MinGW
终端中输入的。
一、直接生成Ninja文件
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. 编译
使用命令
meson compile -C build
或者
ninja -C build
编译项目。
3.安装
meson install -C build
安装目录为之前配置的${PWD}/install
,即源码目录下的install目录。
将安装目录bin
下生成的DLL,复制在要调试的程序的工作目录,否则会调用到MinGW中的DLL。
由于目前没有IDE支持meson
,所以这种方式不能直接使用glib中的测试用例进行调试,需要自行创建CMake
项目,把测试代码复制过来生成。
二、生成基于Ninja的VS2022的项目文件
meson
也支持生成vslite
的项目,目前默认是VS2022:
meson setup vs2022 --buildtype debug --genvslite vs2022
这样会生成如下几个目录:
在vs2022_vs
目录下可以看到glib.sln
解决方案文件:
使用VS2022打开后,进行构建,其实质还是使用的Ninja来编译的,需要使用到MinGW环境。
这样构建好后,理论上是可以运行glib自带的测试用例,但是实际上还是有点问题,不能直接进行调试。拿gobject
的override
测试项目为例,需要设置调试器的参数:
设置好后,同样需要将生成的调试版本的DLL(libglib-2.0-0.dll
、libgobject-2.0-0.dll
、libgio-2.0-0.dll
、libgmodule-2.0-0.dll
、libgthread-2.0-0.dll
)根据需要复制到工作目录下。由于VS2022使用的是自己的调试器,而非GDB
或者LLDB
,所以调试时可能会不能步进进入glib
的函数调用的源码中(笔者测试下来是不能进入的),需要先在其中打断点。
三、生成基于MSBuild的VS2022项目文件
前面使用--genvslite
参数生成的VS2022项目是基于MinGW开发环境的,需要安装MinGW环境。要想生成使用微软C/C++编译器编译的纯VS2022的项目文件,可以使用下面的命令:
meson 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下载的版本,所以需要屏蔽掉:
pcre2 = dependency('libpcre2-8', version: pcre2_req, required: false, allow_fallback: false)
使用:
pcre2 = dependency('libpcre2-8')
而2067行elif host_system == 'windows'
到2078行也需要屏蔽掉,否则meson
会报错:
ERROR: Dependencies must be external dependencies
网上有报meson
的BUG,但是还未解决。
现在执行:
meson setup vs2022 --backend vs2022 --buildtype debug --prefix ${PWD}/install --reconfigure
可以看到pcre2的版本使用的是subprojects下的了:
再看概览:
在vs2022目录下的生成了VS2022的解决方案文件glib.sln
,现在可以使用它来编译测试用例了。还是以GOjbect下的override
测试用例为例,它之设置为启动项目,然后只编译它,会自动编译所有依赖项,完成后将生成的DLL复制到override.exe所在的目录,就可以调试了。
这里是使用的VS的本地调试器,所以比之前的调试体验都要好!
记录不易,如果对你有帮助,欢迎点赞收藏!