windows下glib库的编译与调试
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. 配置
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自带的测试用例,但是实际上还是有点问题,不能直接进行调试。拿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的项目文件,可以使用下面的命令:
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的本地调试器,所以比之前的调试体验都要好!
记录不易,如果对你有帮助,欢迎点赞收藏!
- 原文作者:Witton
- 原文链接:https://wittonbell.github.io/posts/2024/2024-12-25-windows下glib库的编译与调试/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。