windows下glib库的编译与调试

ops/2024/12/26 3:42:32/

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. 配置

 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自带的测试用例,但是实际上还是有点问题,不能直接进行调试。拿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的项目文件,可以使用下面的命令:

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的本地调试器,所以比之前的调试体验都要好!

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


http://www.ppmy.cn/ops/145018.html

相关文章

linux检测硬盘

通过fdisk 查看显示所有磁盘或闪存的信息 fdisk -l /dev/sd*使用 badlocks检查 linux 硬盘上的坏道/坏块。也可以修复坏道,但仅限于逻辑坏道,物理坏道只能更换硬盘 badblocks -s -v /dev/vdb1 > /badblocks-vdb1.txt tail -f badblocks-vdb1.txt #检…

用Python开启人工智能之旅(四)深度学习的框架和使用方法

第四部分:深度学习的框架和使用方法 用Python开启人工智能之旅(一)Python简介与安装 用Python开启人工智能之旅(二)Python基础 用Python开启人工智能之旅(三)常用的机器学习算法与实现 用Pyt…

探索 Samba 服务器:搭建跨平台文件共享的桥梁

samba 介绍 samba最先是再Linux和Windows两个平台之间建立一个桥梁,使得Linux系统和Windows系统之间互相通信和传输内容,比如复制文件、实现不同操作系统之间的资源共享等。在实际应用中,可以将samba服务器设置成一个功能非常强大的文件服务器。 SMB协…

Java爬虫获取1688关键字接口详细解析

概述 在电商领域,获取商品信息和价格对于市场分析、价格监控和供应链管理至关重要。1688作为中国领先的B2B电商平台,提供了海量的商品数据。本文将详细介绍如何利用Java爬虫技术合法合规地获取1688商品关键字接口数据。 前期准备 Java开发环境&#x…

计算机网络:IP地址相关知识总结

目录 一、IP地址的表现形式 1.1 十进制表示形式 1.2 二进制表示形式 1.3 转换示例介绍 二、IP地址的组成 2.1 网络ID 2.2 主机ID 2.3 示例 三、IP地址的分类 3.1 A类地址 3.2 B类地址 3.3 C类地址 3.4 D类地址 3.5 E类地址 四、常见的特殊IP地址 五、IP地址二进…

ABAQUS纤维混凝土细观模型基于梁单元建模

钢纤维混凝土(SFRC)弥补了素混凝土抗裂性的不足,为建立钢纤维混凝土的力学本构模型,本案例通过CAD随机纤维3D插件建立随机分布的纤维线模型,并将模型导入ABAQUS内,通过梁单元纤维模型,研究细观纤…

配置清晰,nignx http tcp 代理 已经websocket

启动 docker run -it --name lv_ocr --privilegedtrue --restartalways --nethost -v $(pwd)/config/nginx.conf:/etc/nginx/nginx.conf -v $(pwd)/config/conf.d:/etc/nginx/conf.d -d harbor.jettech.com/jettechtools/nginx:1.21.4 [rootit4it-prd-99 config]# ls conf.d…

web越权简介

横向越权(Horizontal Privilege Escalation)和 纵向越权(Vertical Privilege Escalation)是常见的授权和访问控制漏洞。它们都涉及到用户对其不应该访问的资源或操作的访问。下面将详细解释这两种越权类型,并通过案例说…