欢迎来到我的博客。
阮华锋的个人博客
随缘更新
欢迎来到我的博客。
随缘更新
自从上班的地方不给用苹果之后,我就慢慢地将使用环境从苹果中迁移出来, 这篇博客说的是将音乐库从 Apple Music 迁移到 navidrome 中的一些实践。 需求 智能歌单功能 可以缓存音乐的客户端 可直接扫描音乐文件夹 综上,选择目前能满足我需求而且开发较活跃的 navidrome 。 navidrome 安装方面,用 docker compose 启动镜像,配置好之后可以开机启动,只要设置好 docker desktop 的开机启动即可。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 services: navidrome: image: deluan/navidrome:latest container_name: navidrome user: 1000:1000 ports: - "4533:4533" restart: unless-stopped # 自动重启 environment: PUID: 1000 PGID: 1000 TZ: Asia/Shanghai ND_TRANSCODINGENABLED: true volumes: - "/home/ruan/navidrome/config:/data" # 映射配置文件 - "/mnt/g/Music:/music:ro" # 映射音乐库 遇到的问题 alac 无损格式无法播放 之前通过 apple music 无损格式管理音乐库,所以音乐格式是通过m4a容器存储的。 但是 navidrome 的 web 页面和一部分客户端没办法直接播放m4a播放,这一点让我比较烦恼。 ...
一般来说,只要指定输入文件和输出文件的名称,ffmpeg就会自动根据后缀判定正确的格式。 ffmpeg我经常用来转换图像,存放在iCloud的图片如果小于1MB,就会自动下载。我利用这个特性,将漫画压缩到小于1MB放在iCloud上,用iPad看很方便。 图片视频裁剪 这种用法也适用于视频。 1 2 3 4 # crop=a:b:c:d # ab分别代表输出图片宽度和长度,cd代表裁剪矩形左上角在图片中的位置 # in_w代表输入图片的宽度,in_h代表输入文件的高度 ffmpeg -i "test.png" -vf "crop=in_w/2:in_h:in_w/2:0" output.png gif转mp4 这个需求是想要将gif转换成一段指定长度(10s)的循环播放视频。 1 ffmpeg -i "test.gif" -ignore_loop 0 -t 10s out.mp4 视频切片 裁剪从30s开始算起的30s视频 1 ffmpeg -i "test.mp4" -ss 00:00:30 -t 00:00:30 out.mp4 改变视频速率 将视频的速率修改为32Hz 1 ffmpeg -i "test.mp4" -r 32 out.mp4 拼接图片 1 ffmpeg -i cat.jpg -i dog.jpg -c copy -filter_complex vstack vout.jpg
一个炫酷的命令行程序它到底需要什么? 构建系统 命令行参数解析 日志系统 代码文档系统 第三方库可以用cmake管理,自从qt官方构建系统转到cmake之后,感觉cmake基本上已经成为c++项目的事实构建系统了。 命令行参数解析和日志系统可以使用gflags和glog,代码文档系统自然是通用的doxygen。 cmake 基本上可以把makefile淘汰掉了,makefile最致命的一点就是无法自动构建依赖。在c和c++中,源文件的头文件依赖如果使用makefile构建,要么就手动管理依赖(要命),要么就写个又长又臭的makefile来自动构建(还是要命)。在简单地学会cmake之后,就放心大胆地跟makefile说拜拜吧。 构建工程 有一些必须添加的首行比如指定cmake版本,添加源文件。 1 2 3 cmake_minimum_required(VERSION 3.20) project(cmdline) add_executable(${PROJECT_NAME} main.c) 还有就是引入依赖,这个工程我是基于glib做的。glib提供命令行解析、日志系统、单元测试等功能。 1 2 3 4 find_package(PkgConfig REQUIRED) pkg_check_modules(GLIB glib-2.0 REQUIRED) add_definitions(-DG_LOG_USE_STRUCTURED) include_directories(${GLIB_INCLUDE_DIRS}) 文档生成,引入Doxygen生成文档。 1 2 3 4 5 find_package(Doxygen) if (DOXYGEN_FOUND) message("Doxygen build start") doxygen_add_docs(docs ${PROJECT_SOURCE_DIR} ALL) endif() 命令行参数解析 命令行参数解析最常用的是posix标准getopt或者gnu的getopt,qt和glib都有自己的命令行解析工具。 我使用的是glib提供的命令行解析,简单用法跟getopt差不多。不过glib这个东西还扩展了一下用法, 有group这个概念,因为文档不详细我也没仔细研究。 ...
这边论文的basic idea比较简单,就是放出诱饵和不断改变网络位置(IP地址)来缓解网络侦察(reconnaissance)攻击。我认为它的实验很有意思,本来我以为会在路由器层面进行实现,通过改变IP包的方式对上层透明化。结果后来一看,发现竟然是在一台电脑上搭建虚拟机来模拟全部环境。这就是乞丐版实现吗?不过仔细一想,其实这种实验的可行性高而且也可信,简直就是最好方案啊。 还有就是这篇论文在实现它的协议时用到了很多的知识,对这些知识进行简单的了解会对网络空间安全方向有一个大致的了解。我认为这个还是很值的注意的。 Problem 网络攻击者会对IP地址进行探测,为了找出现有系统的缺点或者是监控这个系统。 Basic Idea 动态改变IP地址+大量释放诱饵(decoy)缓解网络探测攻击。而且在改变IP地址的时候还不能中断现有服务。 收获 [ZMap](https://www.usenix.org/system/files/conference/usenixsecurity13/sec13-paper_durumeric.pdf)能花45分钟把整个IPv4的地址探测完。 NMap是一个网络探测工具 honypots原来是用于吸引攻击者和学习攻击者模式的,在这篇论文中用来延长其扫描时间 用常用服务:ssh, ftps, sftp, udpchar, tftp来做实验 Thinking 这个方法需要大量的IP地址来释放诱饵,如果把迁移往协议栈挪上一层,到TCP/UDP层面会不会降低开销呢?但是端口号只有65535个,如果只在这么多个端口号中进行randomization会不会显得有些不够用?考虑到吞吐量,应该只是需要迁移端口就足够了。
最近对Web技术提起了一些兴趣,想学学web开发。现在搭建网站据我所知,PHP和java用的最多。但我就是喜欢特立独行,想试试别的东西。发现asp.net貌似不错,我对c#的观感挺好,而且现在.net框架也开源并支持跨平台了。所以就在vs上安装了.net的开发环境,准备学一学。 初始化一个工程后,看到运行环境里有docker。这东西这几年貌似很火,之前在图书馆里有看过相关的书籍,里面写的高深莫测,什么容器,什么集群花里胡哨也没详细看。正好趁现在有兴趣也学一学docker。 官方教程 上官网看了下,发现现在docker在windows下推出了desktop这个图形界面用来管理运行中的状态,而且整个界面还设计得很不错,简单易用。下载了安装包,配个版本较新的windows就能直接用。核心是用微软的wsl2跑的,原来微软切换到wsl2还有这个好处,毕竟有些东西只有Linux内核才跑的动啊。 打开docker desktop之后,会弹出一个框教新手怎么用的。我点了进去,发现这个教程直接就是一个用docker运行的一个http服务。首先是直接用git image把教程仓库clone下来,然后直接将这个仓库编译成docker的image,再运行这个image,就能直接在浏览器上访问localhost阅读这个教程啦。 这一下子吸引住了我:寥寥几步,就把docker的作用和使用步骤跟教程紧密结合在了一起,实在是很有意思。所以说,这种新兴的计算机技术或者是语言,看多少书都不如上官网看一遍tutorial然后实操,效果差太多了。一个优秀的项目肯定有优秀的官方教程,如果没有,说明它还不够优秀。 核心概念 感觉docker就是个虚拟机,专门设计用于运行服务的。下面以我的理解(仅仅是操作完了官方教程的水平)描述一下一些相关概念。 image 一个包含了程序和所需依赖的包,用docker构建 container 每次run image都会产出一个新的container,用来保存每次运行产生的变化,比如说环境变量,配置文件什么的。 volumes 有一些文件要保存在container之外的地方,这样更新image再运行container的时候,中间数据就不会丢失了。这个地方就叫volumes。 network container之间用network通信,处于同一个network的运行实例能相互通讯。 应用 总的来说,感觉这东西适合运行一些不会关闭的软件,比如监听80端口的web服务。也有一些很有意思的应用,比较广泛的应该就是github actions。jekyll就能通过docker来构建和发布GitHub pages。参考helaili写的jekyll-action 在了解过docker的操作流程和基本概念之后,这东西很容易搞懂。原理就是创建一个ruby的container,在这个环境里运行一个简单的shell脚本。这个脚本的作用是下载仓库->安装jekyll依赖->构建jekyll->发布网站。非常有意思,脚本名字是entrypoint.sh,有兴趣的可以看看。 我跟着这个仓库的README试了一下,真的非常实用。再也不用局限于GitHub自动构建的jekyll版本和插件啦,超爽! 像这种CI(Continuous integration)工具,能实现很高的自动化。像是打包发布安装包,运行单元测试之类的机械性工作都能完全自动运行。花在构建和学习自动化工具的时间我认为是非常值得的。CI工具走的比较前的貌似是gitlab,glib库就是很标准的例子,还有就是gtk的官网也是用CI构建的。github算是比较晚的,2018年才推出。 参考 Docker Desktop Introduction to GitHub Actions
我一直都对C语言情有独钟,是受《C语言点滴》这本书的影响。glib库作为一整个gnome的底层架构,在实现了类似于c++ std库的功能下,还包括了文件系统,多线程,定时器这些跨平台的方便组件。在跨语言领域上,也有完善的g-object系统bind各种语言。如果需要编写一个完善的库,可以说使用glib是非常合适的。我准备过一遍glib参考手册,然后再读一读源码,写一些使用这个库的使用方法和抽象概念。 前几天glib官方的参考手册移到了gtk的域名下进行管理,整个界面变得现代化了很多。加上之前的gtk官网更新,感觉gtk系列也要慢慢地崛起了。当然,跟qt系的使用率还是没法比。 基础数据结构可以类比c++的std标准库,数据结构只包括glib库的一部分。论使用的便利当然是不如c++的,但加上glib的其它各种组件,用起来还是很不错。如果想要弄清楚用法,直接查看glib代码仓库的单元测试最正确全面。在这里只简单谈谈我感兴趣的地方。 GArray 类似于c++中的vector,但是功能没有那么强大。new的时候需要指定数组元素的大小,但是不需要指定元素个数。也就是说new出来的GArray都是空数组。而且也不能一个一个地添加元素,只能添加数组。内置有排序,二分查找,引用计数,各种删除操作。 将这个数据结构跟vector进行对比其实是不合适的,vector致力于取代c的数组,而GArray则是对c数组进行补充。从只能append_vals中就可以看出来,用法大约是先暂存在c数组里,然后一次性添加到GArray中,再进行各种操作。当然,一个一个地添加也是可以的。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include <glib.h> gint comp(gconstpointer a, gconstpointer b) { double x = *(double *)a; double y = *(double *)b; if (x < y) return -1; else if (x > y) return 1; else return 0; } int main() { GArray *arr = g_array_new(FALSE, FALSE, sizeof(double)); double t[] = {1., 5., 6., 8., 3., 9.}; g_array_append_vals(arr, t, sizeof(t)/sizeof(double)); g_array_sort(arr, comp); g_print("len: %d\n", arr->len); // len: 6 double *p = (double *)arr->data; /* 1.000000 3.000000 5.000000 6.000000 8.000000 9.000000 */ for (int i = 0; i < arr->len; i++) g_print("%lf ", p[i]); } GByteArray 字节数组,是GArray的子集,元素类型固定为Byte,在使用上方便很多。 ...
有时用vim打开一些文件时,会显示乱码。打开一些专辑的cue文件时,foorbar2000也会显示乱码。这都是编码不一样在作怪。 我受编码问题的苦久矣,从日常用msys2环境下的一些不兼容,到串口调试乱码问题,甚至在编程时使用注释和git时,都有乱码的困扰。 编码不统一的弊病是历史遗留问题,最开始使用计算机的家伙们只用英文。而英文总共就26个字符加上一些其他符号,所以所有的可打印字符只需要用8位的char就可以全部保存。后来等到使用其它语言的人们也需要打印字符时,8位的char就没办法保存了。在这期间,出现了各种解决方案,这就是编码问题的起源。 关于编码的问题,Li Yucang的 彻底弄懂Unicode编码 已经讲的非常透彻,我就不再详细复述。 我之前听说utf-8时在Plan 9中发明,然后被各种Unix变体接受,从而广泛使用的。涛叔的 UTF-8往事 有提到这方面的一些历史。 uchardet 这是一个从Mozilla项目中整出来的检测编码工具,ByVoid的 博客 有讲到这个工具诞生的一些事 iconv 通用的编码转换工具 实践 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 $ ls CDImage.cue $ uchardet.exe CDImage.cue SHIFT_JIS $ iconv.exe -f shift-jis -t utf-8 CDImage.cue >CDImage-utf8.cue $ iconv.exe -f shift-jis -t gbk CDImage.cue >CDImage-gbk.cue $ ls CDImage.cue CDImage-gbk.cue CDImage-utf8.cue $ head CDImage.cue PERFORMER "" TITLE "▒N▒h▒▒ӂ▒▒[ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒T▒FKud Wafter Original SoundTrack" FILE "CDImage.wav" WAVE TRACK 01 AUDIO TITLE "Track01" PERFORMER "" INDEX 01 00:00:00 TRACK 02 AUDIO TITLE "Track02" PERFORMER "" $ head CDImage-gbk.cue PERFORMER "" TITLE "▒▒▒ɤ▒դ▒▒` ▒▒▒▒▒▒▒▒ ▒▒▒▒▒ص䣺Kud Wafter Original SoundTrack" FILE "CDImage.wav" WAVE TRACK 01 AUDIO TITLE "Track01" PERFORMER "" INDEX 01 00:00:00 TRACK 02 AUDIO TITLE "Track02" PERFORMER "" $ head CDImage-utf8.cue PERFORMER "" TITLE "クドわふたー 初回限定版 初回特典:Kud Wafter Original SoundTrack" FILE "CDImage.wav" WAVE TRACK 01 AUDIO TITLE "Track01" PERFORMER "" INDEX 01 00:00:00 TRACK 02 AUDIO TITLE "Track02" PERFORMER ""
我用apple music听音乐。天天静听是我用的第一个音乐软件,之后是qq音乐,再之后是网易云音乐。用过的这些软件都有些不合心意,没有那种能用一辈子的感觉。就拿网易云音乐来说吧,因为版权问题各种没法听,明明昨天可以听,今天就不行;曲库不全;喜欢的音乐莫名其妙的消失;烦人的各种社交功能;官方发过来的不定期废话软文…… apple music最好用的是上传功能,我能上传自己的音乐。上传的音乐统一存在音乐库进行管理。上传之后我能用电脑,手机各个平台听。还有就是它是一款纯粹的音乐软件,没有广告,没有社交,用起来像在用MP3。再有就是价格便宜,国区每个月也就10块钱,配有近乎无限的音乐上传数目,现有的音乐全部能听。除了曲库不太全外,基本上没有任何的缺点。而曲库不太全在完善的上传功能下也不算什么缺点了。 知乎用户守护未来有一篇文章提到apple music的廉价订阅方法,我用的是合租。 如何管理自己的音乐 依靠两个工具mp3tag, foobar2000,以专辑为单位管理音乐。简单来说就是将专辑歌曲统一转换成Apple lossless格式,找不到无损的就按照原样保存,然后用mp3tag打上合适的标签,专辑封面也保存好。用itunes传上自己的资料库,音乐文件夹同步上传到云盘进行备份。 foorbar2000 强大无匹的音乐播放器。基本上你能找得到的音乐格式它都能播放,有些需要安装相应的插件。我最喜欢它的音乐格式转换功能,能把标签也保存下来,无敌! Mp3Tag 虽然名字叫mp3,但是所有的音乐格式都能打上标签(被名字耽误?)。标签有很多种,我以苹果音乐中会使用到的标签作为标准。 名称 作用 Title 歌曲题目 Artist 一般是歌手 Album 专辑名 Year 发行年份 Track 第几首 Genre 种类 Album Artist 专辑作者 Discnumber 第几张碟 注意 如果一个专辑中有不同的artist,就需要特地填入album artist,否则苹果音乐会识别为两个不同的专辑。也就是说,它通过专辑名+作者的方式标识专辑。 苹果音乐上传时会用某种算法自动匹配曲库,如果没有匹配成功才会上传。其实《歌物语》在曲库中是有的,但我不喜欢那版封面还有罗马音的歌名,所以才重新上传。也就是说可以随意修改自己上传的歌曲的标签。 可以把苹果音乐中的歌当成MP3/320K的音质,因为我上传的无损音乐并没有无损标志。听工友说BSD16bit的音乐和BSD24bit的音乐听起来很不一样,而24bit和32bit的音乐就听不出什么差别。而CD的位数是16bit,再加上压缩编码……因为我听不出MP3/320K和CD格式有什么不同,所以我对这方面倒不是很纠结(主要是莫得钱)。 安卓端也有苹果音乐软件……
明明我应聘的是嵌入式,却要我开发一款ios软件?我以前可是从来都没有碰过苹果系的产品。结果这一趟走下来,从注册公司开发者账号,开发软件,上架商店,也有一些收获。这篇文章主要是一些感想,记下来备忘,也想给一些想做苹果开发者的朋友们一些提示。 开发者账号 首先是开发者账号,只要是要做ios开发,没有苹果的开发者账号你甚至没办法把程序发出去给别人用。 开发者账号还有个好处就是可以构建测试版本,通过testflight软件发布的测试版程序根本不需要苹果审核。名额足足有10000人,可以添加appleid自动发送测试邮件,也可以发送公开的邀请链接邀请别人下载安装软件。有些特殊需求的软件甚至不需要发布在app store上,使用人数也没这么多,那么testflight就够用了,不用走审核上架的流程。总之申请账号越早越好。 申请 开发者账号分公司账号和个人账号,是哪个就申请哪个。申请公司开发者账号麻烦点,我那时候花了3-4天,期间苹果又是给老大打电话,又是给老板打电话确认。我认为苹果是通过这种方式在收集公司信息,真是个可怕的公司。至于申请方法,没什么值得一提的,按照官网流程走就可以了。 还有一件事,当时我不知道怎么判断账号是否是开发者账号,其实直接上开发者中心登陆账号,如果账号左边的栏目不多,比如没有App Store Connect、Certificates等栏目,就说明还不是开发者账号。我发一张开发者账号的截图出来参考。 开发 我到处查看资料,发现swift+storyboard的方式最方便合适。然后就是看了几天教程,一步一步把工程搭起来。期间谷歌和苹果开发者平台以及百度(排名分先后)给了很大帮助。 swfit 学语言就那么一回事,反正也不深入。先看几天基础,比如怎么定义变量,定义函数,条件判断,循环怎么写,内存怎么管理,就可以开始着手了。 swift的内存管理是计数应用,不知道的可以点进wiki了解一下。因为不够熟练,我在这个地方遇到过问题。将函数内定义的类直接放到后台运行,结果函数一退出,程序就把那个后台就给我GC掉了,当时想了下才发现这个问题。 对于c/c++出身的我理解那个变量的管理方式有点困难,很是费了一番功夫。比如var s: String?和var s:String的不同之处。印象中这种语法是从c#开始使用的,通过这种方法能有效地避免指针的出现,我认为这是一种很巧妙又优雅的解决方案。 用过的东西包括定时器、??语法、闭包lambda、还有就是用NSLog替代print,NSLog前面自带时间,调试好用。还有就是直到后来我才发现if没必要写括号,尬住了。 我一直都没搞懂在引用计数下闭包是怎么管理生命周期的,也没搞懂let到底是怎么区分常量的(类比c中指针const的位置),闭包那奇葩的语法只会用(写是不可能写的……)。总之就是,我又不专门搞苹果开发,学那么多干嘛。 storyboard 用swift花不了几天时间,摸索storyboard怎么用和画软件的界面花的时间才多。不过搞熟了之后速度还是很快的,简单明快,拖拖拉拉就完事。我在弄这玩意的时候爽得很,脑子不用动,头发就少掉。 基本上全部的显示都可以在storyboard中做,绘制页面,页面间的跳转,直接把view拖到page对应的类里面,填上名字就能用。segue给一个唯一名称,在代码里直接就jump。打开storyboard,截屏就是一个软件原型图,不用再搞其它花里胡哨。总之界面开发就一个字,爽。 这东西没什么可讲的,慢慢摸索就能学会。我没怎么看那些教程(大多都又长又臭),都是一个一个地方点几下,查文档,配合搜索引擎。 一些废话 百度的苹果开发都是全是基于objc讲的,而且都是前几年的比较多,可能是前几年流行过一阵子的ios开发有关?我读的大学里还有一个专门的苹果机房,听说是前几年配置的。不过配置之后就没开过几门课,我读的时候也没有开,因为根本没人选。就我个人本身而言的话,苹果电脑贵的要命,每年还要几百块的账号注册支出,比我家拉网线还贵,实在是舍不得。而对比国外同事人人一台苹果的情况之下,看来我们还是不够富有啊。 谷歌搜索出来的信息就全是用swift讲的。从这点可以看出国外的软件开发更加繁荣,个人开发者和小公司开发者很多。因为中小型应用很多,所以对新技术的接受程度普遍而言非常高,软件开发氛围是真正的好。而对比国内,其实可以发现软件公司们就像土地兼并一样,大厂们不断吸收中小软件公司,环境很是恶臭,我觉得这点非常不好。像是以前很好用的快图和天天静听,都是在收购之后销声匿迹了,如果…… 公司配置的二手苹果笔记本好难用,电池还鼓包。这个软件开发历时约两个月,开发效率让我有点惭愧,不过考虑到以前苹果都没摸过,仔细想想也可以接受?还有就是,我好像要一台苹果笔记本! 上架 上架其实很简单,跟着官方的指示走就行,原则就是把审核员当成客户对待。我开发的是物联网应用,没有产品根本没法用,就一个死页面。不过我准备了产品的官网,产品的介绍PDF,软件使用视频(重要)之后,审核员很快(2天)就给我通过了,通过之后就能在app store上搜索到开发的程序啦😄。
习惯了Posix环境下的各种方便工具,就很难在Windows平台下得到较好的编程体验。而在当前国内的网络环境下,直接使用Linux系统又有极大的不便之处。再加上Windows平台上又有很多软件没办法舍弃,所以我一直在寻找一种替代方案:在Windows上安装Posix环境。 Posix环境 编程环境总共就两家,Windows和Unix。上个世纪出现了很多Unix系统,使用上分化很严重。尽管都是叫Unix,但它们的兼容性没法保障。比如我在这台机器上写的程序,在另一台机器上甚至没法编译通过!后来就出现了Posix标准,符合这个标准的才给叫Unix。这下好了,我们写的程序不需要一个一个系统地测试了。 最热门的Linux系统属于类Unix系统,用起来一般不会出现跟Posix标准不符合的情况(反正我没见过)。所以大多数说的Linux编程大致等于Unix编程。 在Windows上提供Posix环境操作的主要有两家,msys2和wsl2。 wsl2 我没用过wsl2,不过听说wsl2用的是虚拟化技术,效率上就低了一层。再加上又是个新东西,稳定性肯定欠缺。而且还是微软推的技术,殊不知之前的wsl还没用几天呢,这就wsl2了?说不定明天微软就不爱Linux了。那我岂不哭死? msys2 msys2就好多了,社区推动不会突然间就暴死,更新稳定性更有保障。在国内也有专门的镜像源(你甚至不需要做任何的配置),上清华软件站下载打包好的安装包一键安装就可以了。配有专门的软件包管理工具pacman,安装卸载软件包一键搞定。还可以通过配置注册表在文件夹下右键打开终端,获取跟Linux一样的体验。 我对它唯一的不满就是这终端界面,也太丑了。不过我都懒得去美化它,麻烦不说,稳定性就没法保障。尽量保持默认配置,是我稳定使用工具软件的诀窍。 所以终极方案就是Windows10+msys2+虚拟机。为什么还需要虚拟机呢?有时候一些东西实在是没法在Windows系统上搞的(比如ROS),就只能装个虚拟机勉强用着了。 msys2配置 如何添加右键打开,软件包管理工具的简单使用。 添加右键菜单 打开注册表HKEY_CLASSES_ROOT\Directory\Background\shell 新建项msys2,默认值修改为msys2 新建字符串值,命名为icon,修改值为C:\msys64\msys2.icon 修改command的默认值为C:\msys64\msys2_shell.cmd -mingw64 -here 软件包工具pacman pacman 其实是arch项目的软件包管理工具,与arch通用 {% highlight sh %} pacman -Ss qt6 # 搜索软件包 pacman -S mingw-w64-x86_64-qt6 # 安装qt6 pacman -R mingw-w64-x86_64-qt6 # 删除qt6 pacman -Q # 列出已安装的软件包 {% endhighlight %} 安装环境的选择 搜索软件包之后发现很多不同前缀的软件包。 分别是mingw32, mingw64, ucrt64, clang64, msys。这些前缀分别对应各个不同的运行环境。从msys2的根目录可以看出,里面有对应前缀的可执行文件,分别对应不同的执行环境。我习惯使用mingw64环境,一直都没出现过什么问题,所以我也推荐你使用这个环境。 在安装时选择对应环境的安装包,然后在相应环境打开的shell中就可以使用。比如你安装了clang64的软件,就只有在打开clang64.exe的终端中才能使用软件,在其它环境中是搜索不到的。 注意到上面右键打开终端菜单设置中打开的是ming64环境。 在使用软件包工具时我安装的也是mingw64的软件包。