- 博客(262)
- 资源 (63)
- 问答 (1)
- 收藏
- 关注
原创 Modern CMake 简明教程(8)- 集成Qt
在上面示例中,设置了可执行字符集为 utf-8,这种方式可以防止 Qt 在 MSVC 环境下出现中文乱码,详见之前的文章 {% post_link 拨开字符编码的迷雾/拨开字符编码的迷雾-2-编译器处理文件编码 %}。而设置 VS_DEBUGGER_ENVIRONMENT 属性是为了设置 Visual Studio 的调试环境(如下图所示),确保在调试时能找到 Qt 的相关 dll 文件。下面是一个简单的 CMake Qt 项目示例,该示例仅使用了 Qt 的 QWidget 模块。
2024-10-25 15:24:43
342
原创 Modern CMake 简明教程(7)- 集成第三方库
在项目中集成第三方库是一种非常常见的需求,CMake 提供了两种方式来集成第三方库。说到集成第三方库的源码,我们第一时间想到的可能就是将其源码直接拷贝到项目目录中,然后提交到 git 仓库,更加高级一点可能会使用 git submodule 的方式。但我以为这两种方式都不够优雅,无法很好的管理、更新依赖库,特别是在项目的依赖库的比较多时。这种方式需要先单独编译安装第三方库,然后使用 find_package 查找该库,最后设置目标的相关属性,如包含目录、依赖库等。
2024-10-17 16:36:56
196
原创 Modern CMake 简明教程(1) - 初识 CMake
是一个开源、跨平台的构建系统生成器(Build-system Generator)。CMake 是构建系统生成器,而不是构建系统,CMake 支持生成不同构建系统所支持的工程文件,如 Visual Studio,XCode,Makefile 等。本教程作为 CMake 的简明教程,不会事无巨细的讲述 CMake 的每一个语法,而是以实用为目的,介绍 CMake 的基础语法和常用指令。
2024-10-08 18:10:29
466
原创 Modern CMake 简明教程(6)- 与 CMake 交互
形式的变量会被替换,而其他形式的变量会保留不变,这种方式虽然在生成 .h 文件时没有什么用途,但谁又说 configure_file 只能生成 .h 文件了?上述变量替换的方式有一个弊端:虽然能动态替换模板语句中变量的值,但却不能控制语句是否存在。后缀名,例如我们需要通过模板文件生成 version.h 文件,则模板文件名为。选项来指定一个模板文件,虽然模板文件可以是任意的后缀名,但我们通常使用。形式的变量都替换为对应变量的值,如果变量没有被定义,则替换为空字符串。选项,指定该选项后,就只有。
2024-10-08 18:02:58
142
原创 Modern CMake 简明教程(5)- 安装
侠义的“安装”是将拷贝到,CMake 中的安装包含但不限于拷贝文件,还可以执行脚本、修改权限等操作。上面这句话中,涉及到了2个术语,有必要解释一下。“目标编译生成的文件”在 CMake 中有个学名,叫,直译为输出工件,我更愿意将其翻译为“输出品”,不同类型的目标有不同的输出品,例如在 Windows 平台上,可执行程序输出 .exe 文件,动态库输出 .dll 文件(也可能包含 .lib 文件),静态库输出 .lib 文件…请牢记 Artifacts 这个单词,在后面的很多定义中都会出现该词。
2024-10-08 18:02:10
210
原创 Modern CMake 简明教程(4)- 生成器表达式
不知你是否思考过这样一个问题:我们在编译项目时,通常有不同的配置,如 Debug 和 Release,如何在不同的配置中定义不同的预编译宏、包含不同的目录、依赖不同的库呢?解决这个问题,并不困难,需要使用到 CMake 中的。我们在开源项目的 CMake 脚本中经常看到的$这样的表达式就是生成器表达式,但通常都会嵌套使用,如。前三种形式比较简单,最后一种形式虽然有多种类型,但我们通常只需要记忆几种常用的,有需要时查阅。
2024-10-08 18:00:43
189
原创 Modern CMake 简明教程(3)- 目标属性
在介绍如何设置目标的属性之前,我们先学习一下如何调试输出目标属性,方便在开发中检查属性设置是否出错。使用 CMakePrintHelpers 模块提供。
2024-10-08 17:59:23
145
原创 Modern CMake 简明教程(2)- 基础语法
CMake 是一个开源、跨平台的构建系统生成器(Build-system Generator)。CMake 是构建系统生成器,而不是构建系统,CMake 支持生成不同构建系统所支持的工程文件,如 Visual Studio,XCode,Makefile 等。本教程作为 CMake 的简明教程,不会事无巨细的讲述 CMake 的每一个语法,而是以实用为目的,介绍 CMake 的基础语法和常用指令。
2024-10-08 17:55:39
366
原创 快速记忆成百上千个账号密码
在日常生活中,我们不仅需要记忆6位数字的银行卡密码,还需要记忆各式各样网站和应用的账号密码,可能我们自己也不记得曾经注册过多少个账号。账号和密码如此繁多,管理这些账号和密码,也是一个让人头疼的问题。最原始的方法是将密码写纸上,放在一个安全的地方,但纸张存在丢失、损坏的风险,而且不方便存取。
2024-06-24 10:51:05
1178
原创 C++异常之我所见
当我们在代码中写下一行 throw 语句时,我们就此埋下了一个祸根,从此以后,在该函数调用链中,必须至少有一个调用者需要提供相应的异常捕获,否则一旦异常被抛出,程序就会异常终止。
2024-05-31 14:51:40
670
原创 Node插件开发(2) - 调用方式
本文主要介绍如何在Node-API中实现不同的类型的接口,如:- 同步调用- 基于Napi::AsyncWorker的异步调用,通过回调函数返回- 异步调用,返回Promise- 基于Napi::ThreadSafeFunction的异步调用,通过回调函数返回
2024-03-15 11:08:41
610
原创 Windows窗口调试利器-WinSpyPlus
在Windows平台进行客户端开发时,不可避免的会遇到需要调试窗口的情况,如查看窗口句柄、窗口位置/尺寸、监听窗口消息等。虽然微软随Visual Stuido一同发布了Microsoft Spy++工具,但该工具的功能更新缓慢,这么多年过去了基本没有什么变化
2024-03-04 11:21:12
1266
原创 Node插件开发(1) - 快速入门
在使用Electron开发客户端时,如果现有Node模块所提供的功能无法满足需求,我们可以使用C++开发自定义的Node模块,也称插件(addon)。Node.js插件的扩展名为`.node`,是二进制文件,其本质上是动态链接库重命名而来,在Windows平台是.dll文件,Linux/Unix平台是.so文件。
2024-03-04 11:18:56
1509
原创 理解二进制ABI兼容性
ABI是 Application Binary Interface 的缩写,当我们以二进制形式(非源码形式)发布我们的动态库时,就需要关心ABI兼容(也称二进制兼容)。对于静态库,更新静态库始终都需要该库的使用方重新编译,因此不存在ABI兼容的说法。
2024-03-04 11:17:24
2574
原创 全网唯一基于共享内存的C++ RPC框架
Veigar是一个跨平台的远程过程调用(RPC)框架,目前支持Windows、Linux平台。Veigar基于共享内存技术实现,只支持本机进程或线程间的远程过程调用,这是Veigar与其他RPC框架(如Thrift、grpc)的最大不同之处。
2024-02-25 15:14:22
1681
3
原创 Electron+Vue3+Vite的产品级模板项目
基于Vue3 + Electron + TypeScript的客户端程序模板,使用Vite和Electron Forge构建和打包。真正做到开箱即用,面向跨平台客户端设计,产品级的项目模板。
2024-02-02 17:36:41
2355
2
原创 一键启动神器之1key.run
1key.run既是产品官网域名,亦是产品名称。顾名思义,主打一键启动,可以一键启动本地应用、网页搜索,并内置了一些实用功能如日历、科学计算、截图等。
2024-01-09 11:29:00
1280
原创 TinyTu-跨平台图片压缩软件
我平时压缩图片通常会使用类似tinify这样的在线图片压缩网站,这些网站有很多,但使用起来总是感觉不太舒爽,似乎差了点什么,仔细想想它们或多或少有这些缺点:- 有的网站需要收费或者半收费。- 支持图片格式不全,例如有的网站仅PNG格式,而有的网站又不支持jpg、gif等。- 通常还会限制上传图片的数量和大小,毕竟上传和下载都会消耗服务器的网络带宽,网站为了节省成本做出此限制。- 图片的压缩速度较慢,毕竟压缩速度越快对服务器的硬件要求越高,成本也会越高。
2024-01-05 14:53:15
556
原创 C/C++不同整数类型的区别
在C/C++中涉及的整数相关的类型大致有如下几种:- char、unsigned char- short、unsigned short- int、unsigned int- long、unsigned long- long long、unsigned long long- int8_t、uint8_t- int32_t、uint32_t- int64_t、uint64_t- DWORD- DWORD32、DWORD64- size_t、ssize_t- SIZE_T、SSIZE_T
2023-12-20 18:34:54
1652
1
原创 开源库nlohmann json使用备忘
nlohmann/json是一个用于解析JSON的开源C++库,口碑一流,无需额外安装其他第三方库,还支持单个头文件模式,使用起来非常方便直观。
2023-07-14 11:18:59
3094
原创 图形编程接口扫盲
一、常见图形编程接口我们常见的图形编程接口主要分为如下派系:OpenGLDirectXVulkanMetal下图展示了各个派系的分支及特点:二、ANGLEANGLE (全称 Almost Native Graphics Layer Engine)是Google的开源项目,Google创建这个项目为了使WebGL能够在Windows平台上使用DirectX图形接口。从上图可以看到,WebGL基于OpenGL ES开发,而在Windows系统上默认只安装了OpenGL 1.1驱动程序,如
2021-01-27 14:38:56
1198
2
原创 基于Joplin和WebDAV搭建私有云笔记
一、私有Docker搭建WebDAV服务docker-compose.yml文件内容下:version: '3'services: webdav: image: bytemark/webdav restart: always ports: - "9000:80" environment: SERVER_NAME: www.xxxx.com:9000,xxx.com:9000 AUTH_TYPE: Basic volumes
2020-09-21 11:36:59
5201
4
原创 搭建JavaScript和TypeScript开发调试环境
一、安装Visual Studio Code打开Visual Studio Code官网https://code.visualstudio.com/,根据系统选择对应的版本进行安装:根据个人喜欢进行安装,对安装选项没有强制的要求。二、配置Visual Studio CodeVisual Studio Code的优势就是有丰富的扩展包,大多数功能都可以通过安装扩展包来实现。2.1 将默认语言设置为中文安装完Visual Studio Code之后,其界面的默认语言是英文,我们只需要安装“简体中文
2020-08-27 12:50:53
1893
原创 TypeScript语法快速入门
如果你还不了解TypeScript是什么,或者其与JavaScript之前的关系,可以参考:《前后端常用概念》TypeScript是JavaScript的一个超集,支持ES6的语法规范,并在此基础上进行了增强,二者最大的不同在于:TypeScript是强类型语言,而JavaScript是弱类型的语言。下面着重介绍二者的不同之处。一、变量声明TypeScript支持使用var、let、const进行变量声明,但建议不要使用var。TypeScript声明变量时,可以强制指定变量类型或者由编译器自.
2020-08-26 17:52:06
26864
原创 ECMAScript6语法快速入门(二)
一、数据结构1.1 数组JavaScript中使用Array类创建数组对象:// 使用Array类创建数组let cars1 = new Array("Saab", "Volvo", "BMW");// 使用Array类创建数组let cars2 = new Array();cars2[0] = "Saab"; // 支持[]方式访问和赋值,下标从0开始cars2[1] = "Volvo";cars2[2] = "BMW";// 简写方式let cars3 = ["Saab",
2020-08-25 15:14:49
367
原创 ECMAScript6语法快速入门(一)
【写在前面】ECMAScript标准的发展经历了一个漫长的过程,从1997年发布的ECMAScript 1.0,到2011年的ECMAScript 5.1,再到2015年的ECMAScript 2015,以及后面每年都会发布的一个新的ECMAScript版本,版本众多,而且每个版本都有新特性的加入。我们通常用ECMAScript 6来统称ECMAScript 2015及其之后的的版本。但ECMAScript 2015可谓是ECMAScript标准的分水岭,其从制定到发布前后经历了15年,目前绝大多
2020-08-25 15:03:23
365
原创 前后端常用概念
1. 浏览器内核在Web大行其道的时代,网民需要上网浏览网页就需要依赖浏览器这个软件,掌握了浏览器就掌握了流量的入口,于是各大软件公司开始研发自己品牌的浏览器,不同品牌的浏览器其实现原理当然是有区别的,这个实现原理就是浏览器的核心,我们称其浏览器内核。现在市面上有这么多的浏览器,如Chrome,QQ浏览器,搜狗浏览器,这些浏览器厂商是不是都是自己研发浏览器内核了?不是的!因为有些公司或者团体将浏览器内核进行了开源,方便其他人基于该内核进行二次开发,常见的开源浏览器内核有Chromium、WebKit、
2020-08-24 15:42:12
658
原创 CEF的那点事 -- CEF介绍
CEF是Chromium Embedded Framework的简称,是Google公司开发的一个浏览器内核框架,以开源库的方式提供,可以内嵌到第三方程序中。CEF老版本使用的WebKit内核,从2013年开始,CEF已经使用Google自主研发的Blink内核(网上也有人说,Blink是基于Webkit修改而来,这个无从考证)。官网CEF的官网是:https://bitbucket.org/chromiumembedded/cef/wiki/Home,国内用户访问可能不会太顺利。版本CEF经历了
2020-08-05 18:03:49
4160
1
原创 如何实现一个高速文件下载器
我们从网络上下载文件时通常会使用浏览器或者迅雷这样的下载软件,他们的大多具有高速下载(下载速度快),断点续传(可以暂停之后继续下载)等特性。假如我们自己开发的应用软件中也需要支持这些下载功能,我们该如何设计和实现了?本文主要围绕这一问题进行论述。首先,我们将一个完善的文件下载库需要具有的特性列举出来:多线程分片下载断点续传磁盘缓存最高下载速率限制及实时下载速率反馈(可选)多协议支持,跨平台(可选)1. 多线程分片下载Chrome浏览器和迅雷能实现高速下载的核心就是多线程分片下载(这里忽略
2020-07-09 11:28:37
1552
原创 Qt QSS的几种图片显示方式
大家在使用QSS进行图片设置时,一定被image, border-image, background-image这几个属性困扰过。比如他们之间有什么区别,什么时候该用哪个属性来设置等等。本文就来讲解一下这个几个属性的异同点。在讲解之前需要大家对Qt的盒子模型有所了解,建议大家先阅读一下《Qt QSS使用》文章中关于盒子模型的部分。一、background-imagebackground-image按图片实际尺寸显示,超过控件部分会被裁剪,虽能显示SVG,但无法对SVG进行无损缩放;关于backgr
2020-06-10 16:24:34
12675
1
原创 Qt无边框窗体实现方案
Qt虽然提供了诸如Qt::FramelessWindowHint之类的属性可以移除窗体的边框,但是移除边框之后,窗体的一些默认行为也被移除了,如鼠标拖动改变大小、双击标题栏最大化等,这些行为需要开发者自己来实现。本文主要介绍实现无边框窗体的几种方案。笔者认为,一个完美的无边框窗体解决方案需要支持如下功能:支持通过使用鼠标拖拽来改变窗体位置和大小;支持双击标题栏最大化窗体和还原窗体;支持Windows Areo Snap特性;支持系统阴影;支持跨不同DPI的屏幕拖拽;适应分辨率和DPI改变;
2020-05-30 15:56:17
2157
3
原创 Qt 5.13.2版本静态库编译
本文介绍如何使用MSVC编译Qt 5.13.2版本的静态库.1. 下载qt-everywhere-src-5.13.2Qt离线下载地址:http://download.qt.io/archive/qt/下载完成之后,解压到D:\Qt-5.13.2\qt-everywhere-src-5.13.2目录。2. 配置环境变量将如下内容保存到qtvars.cmd文件:REM Set up ...
2020-04-14 15:24:14
1202
原创 WebRTC -- 自定义AudioDeviceModule时线程检查失败
《WebRTC – 添加选择音频输入输出设备功能》一文介绍了Webrtc默认使用计算机上的默认的音频输入输出设备,并且介绍了如何为webrtc指定音频的输入输出设备。读者根据上文介绍的方法实践的时候,Debug版运行时很可能会遇到thread check failed的提示。WebRTC内部有三个主要线程(network_thread,worker_thread,signaling_thread...
2020-01-15 11:20:58
1771
4
原创 Qt QSS使用
一、选择器类型Qt QSS选择器和CSS2、CSS3的选择器类似,建议先学习或者复习一下CSS选择器的语法。QSS虽然和CSS类型,但有也稍许不同,而且支持的语法也没那么多,具体讲解如下。1.1 类选择器/*匹配QPushButton的实例及其子类*/QPushButton { color: blue;}/*匹配QPushButton的实例,但不包含子类*/.QPu...
2019-12-11 14:50:49
1861
原创 WebRTC -- Janus编译部署及配置
Janus是一个开源的WebRTC SFU服务器,可以作为WebRTC的一个端将其收到的数据进行转发,同时提供一些的控制能力,Janus是基于插件架构的,其功能都是通过一个个插件来提供。一、编译部署Janus可以方便的在Linux和MacOS上面编译部署,暂时不支持Windows系统,但可以在Win10的Windows Subsystem for Linux上编译部署。1.1 安装依赖项在...
2019-11-12 20:02:14
2119
原创 WebRTC -- 音视频流传输带宽控制
WebRTC没有提供这方面的接口,我们可以通过修改sdp信息来实现音视频流的传输带宽控制,sdp格式参考之前的文章:《WebRTC – SDP格式解析》实现原理比较简单,就是分别在sdp的audio和video媒体部分加入b=AS:信息,可以参考下面的代码实现:void updateSdpAudioVideoMaxKbps(QString &sdp, int audioMaxKbps,...
2019-11-12 12:01:28
1023
原创 WebRTC -- 添加选择视频输入设备功能
《WebRTC – 添加选择音频输入输出设备功能》介绍了如何添加音频输入输出设备选择功能,本文介绍如何添加选择视频输入设备的功能。添加视频输入设备的选择功能不需要像音频设备那样修改webrtc源码,只需要创建自定义webrtc::VideoCaptureModule即可。int videoDeviceIndex = 0; // 视频输入设备idstd::unique_ptr<webr...
2019-11-12 11:48:24
1030
原创 WebRTC -- 添加选择音频输入输出设备功能
我们先来看看WebRTC中提供音频设备输入输出功能的类结构:从上图中我们看到:AudioDeviceModule接口类是音频设备模型的基类,该接口类及其子类并不提供任何针对音频的实际操作,实际操作都是由AudioDeviceGeneric接口类的子类来提供。AudioDeviceGeneric接口类是音频设备实际操作(如录音、播放、声音控制等)的基类,然后根据平台不同由不同的类来实...
2019-11-12 11:30:44
2960
6
NSIS插件开发示例
2018-01-18
基于NSIS Modern界面制作的网易云音乐安装包
2018-01-18
基于NSIS传统界面制作的网易云音乐安装包
2018-01-18
NSIS用户手册 中文版
2018-01-17
automate-git.zip
2019-07-13
ffmpeg-20180427-4833050-win64-static
2018-04-28
google_appengine
2018-04-26
区块链技术解决方案和安全性方面的问题
2017-12-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人