编译Telegram Desktop
目录
一、前言
二、环境准备
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
三、编译
四、总结和学习
一、前言
Telegram 是一款全球广泛使用的即时通讯软件,以其强大的隐私保护、跨平台同步和丰富的功能而闻名。它支持一对一聊天、群组(最多20万成员)和频道(无限订阅者),并提供端到端加密,确保用户消息的安全性。Telegram 还具备语音通话、视频通话、文件共享(单文件最大2GB)和自定义贴纸等功能。此外,它通过机器人和频道为用户提供自动化服务和内容订阅,广泛应用于个人沟通、品牌推广和社区建设。凭借其简洁的界面和强大的功能,Telegram 已成为全球超过10亿用户的首选即时通讯工具之一。
相信大家都知道Telegram,国内用的大多数都是微信,国外很多用户都是用的是Telegram,而且Telegram的客户端代码是开源的,包括iOS、Android、macOS 和桌面版。今天我着篇文章就是介绍一下怎么编译桌面版的,之前我一直都只是把克隆了一下桌面版的代码,想着跑起来很简单,这几天详细去了解后发现还挺麻烦的,就想着写成文章记录一下。
二、环境准备
2.1
需要用到Visual Studio,我使用的是vs2022的版本,SDK版本是10.0.22000.0,最好不要用太老的版本
2.2
在同一个目录下创建两个文件夹,名称是Libraries和ThirdParty,然后分别去下载Python,git,cmake这三个工具,将这三个工具放在ThirdParty文件夹里。
去区域设置里勾上UTF-8编码
下载地址:
Python3.10:https://www.python.org/downloads/
Git:https://git-scm.com/download/win
cmake2.21及以后版本:https://cmake.org/download/
注意,关于git和cmake的版本不要下载最新的,不然后续自动下载所需的工具和第三方库的时候会有很多很多的报错,我踩了很多很多坑。
我当时使用git最新版本在下面2.5步的时候运行win.bat卡在Receiving objects,查资料发现这个问题必须将git版本降低后才解决的,把原来那个卸载了之后,我又下载了一个新的的git版本
https://github.com/git-for-windows/git/releases/tag/v2.45.2.windows.1
$ git --version
git version 2.45.2.windows.1
cmake我开始下载的cmake-4.0.0-rc3-windows-x86_64版本,后面也是在2.5步的时候运行win.bat出错弹出一个warning,查资料发现是telegram项目对CMake有最低版本需求和策略,我查了一下CMakeList.txt代码,然后直接给原来的cmake给卸载了,最后下载了一个3.31.6稳定的版本。
$ cmake --version
cmake version 3.31.6
2.3
勾选上区域设置里勾上UTF-8编码,直接搜语言设置,就可以找到。
2.4
使用git获取Telegram Desktop,在Libraries和ThirdParty同级目录下直接克隆。
git clone --recursive https://github.com/telegramdesktop/tdesktop.git
2.5
在电脑找vs的X86编辑器,我编译的是32位的telegram,更稳定一些。
打开之后使用cd /d xxx\tdesktop\Telegram\build\prepare进入到win.bat目录吗,然后输入win.bat即可。
显示这样就是过程中,一共有31个依赖软件和第三方库,最后跑完就如下所示:
2.6
这一步主要讲一下2.5的一些出错等问题。
1.关于git和cmake的版本不要下载最新的,具体下载哪个版本参考我上面就讲的2.2 。
2.我在9/31的时候遇到error: RPC failed; curl 56 Recv failure:.....的问题,是因为这个依赖软件内存比较大,打开git,修改一下git的http.postBuffer的值就可以了,我当时改成0.5G,1G,2G都不行,最后一气之下改成10G就可以了。
git config --global http.postBuffer 10485760000
3.最后整个编译完大概是36个G,要确保内存够用。
4.关于2.3步勾上UTF-8编码,等后续跑成功之后就可以关了,要不然你这个电脑很多中文都直接乱码或者消失,尤其是游戏里。
5.有的一直卡在x/31一直下载不了,那就自己手动下载,简单粗暴。
6.在2.5的整个过程可能一直不断有warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。 请将该文件保存为 Unicode 格式以防止数据丢失这种错误,不影响不用管就行。
5.整个2.5大概需要跑半天的时间,不要着急,卡在某个地方就点点键盘的enter键,检查检查VPN网速,我在这一步遇到了很多很多问题,上面只是随便列了几个,可能不全,遇到问题就去看报错和warning或者日志查资料解决,和平时解bug一个思路,一般都是弹出warning,然后显示FAILED然后结束,查资料解决完bug,继续输入win.bat即可,这个时候会出现r重构,a全部重构,s跳过,p打印,q退出这几种选项,点R键就可以。
2.7
2.5的31个所需的工具和第三方库下载完之后,还是使用vs的X86编辑器进入到xxx\tdesktop\Telegram目录,然后输入以下命令即可,命令中的api_id和api_hash是官方提供的示例,自己有的话可以替换成自己的。
configure.bat -D TDESKTOP_API_ID=17349 -D TDESKTOP_API_HASH=344583e45741c457fe1862106095a5eb
2.8
构建成功的话会在out文件夹里出现sln文件,点击就能进入vs22里开始编译了。
三、编译
点击上图Telegram.sin即可,然后生成本解决方案,运行就可以了,编译成功就如下图。
我当时编译完后,遇到两处fatal error C1001: 内部编译器错误,都是if语句,这个bug之前遇到过,都是语法错误,然后检查检查代码发现没有任何问题,看了很多解决方案都是修改“全程序优化项”,我改了之后发现没有生效,查资料知道修改“全程序优化项”只对64位的生效,32位的不行,最后看到一篇文章说将原来工程编译生成的目录全删掉,再编译,居然过了。
当然对于这个问题还有一个简单粗暴的解决方式,就是直接把这两个if语句给注释掉,我不建议这样搞,对于每一个bug要是只解决表面,深处留下更大的隐患以后肯定会出现更严重的bug。
四、总结和学习
在成功编译 Telegram Desktop 后,怎么深入学习其源码是很多人头疼的问题,下面我简单分享一下学习的步骤。
4.1 可以先从项目的目录结构入手,了解不同模块的功能划分,例如 Lib文件夹下的标准库和 Telegram 文件夹下的核心功能实现、慢慢梳理程序的启动流程,理解其初始化逻辑和核心组件的加载方式。
4.2 对于初学者来说,可以从简单的功能模块开始,比如用户界面的实现或消息发送与接收的流程。Telegram Desktop 使用了高效的多线程和异步处理机制,研究这些机制如何实现高性能的消息处理和网络通信,将有助于提升对并发编程的理解。同时,关注其端到端加密的实现细节,学习如何在实际应用中保障用户隐私和数据安全。
4.3 Telegram Desktop 的代码中广泛使用了设计模式,如单例模式、观察者模式等,研究这些模式的运用场景和实现方式,可以加深对面向对象编程的理解。
4.4 还可以通过调试工具逐步跟踪代码执行过程,观察变量变化和函数调用栈,从而更直观地理解代码逻辑,这样可以好好学习Visual Studio自带的各种调试代码强大的功能。
总之Telegram Desktop 的源码是一个丰富的学习资源,通过系统地研究和实践,可以逐步掌握大型C++ 项目的开发技巧和最佳实践。
最后,如果觉得我的文章对你有帮助,请点赞收藏加关注,谢谢大家。
相关文章:

编译Telegram Desktop
目录 一、前言 二、环境准备 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 三、编译 四、总结和学习 一、前言 Telegram 是一款全球广泛使用的即时通讯软件,以其强大的隐私保护、跨平台同步和丰富的功能而闻名。它支持一对一聊天、群组(最多20万成员&am…...

玩转python: 掌握Python数据结构之链表
链表是计算机科学中最基础的数据结构之一,也是许多高级数据结构和算法的基础。本文将带你从零开始,逐步掌握链表的概念、实现和应用。通过丰富的案例和通俗易懂的解释,你将能够轻松理解并应用链表。 什么是链表? 链表是一种线性…...

upload-labs详解(1-12)文件上传分析
目录 uploa-labs-main upload-labs-main第一关 前端防御 绕过前端防御 禁用js Burpsuite抓包改包 upload-labs-main第二关 上传测试 错误类型 upload-labs-env upload-labs-env第三关 上传测试 查看源码 解决方法 重命名,上传 upload-labs-env第四关…...

RAG系统(检索增强生成)的优化策略
RAG(检索增强生成)系统的优化可以从多个方面入手,主要包括数据、查询、检索、生成、框架和评估等几个重要环节。本文将详细介绍这些优化策略,并为每个环节提供具体的操作方法。 一、数据优化 1. 数据清洗和增强 数据质量直接影响检索和生成的效果,因此需要进行细致的数据…...

写毕业论文用哪个AI好?这6款AIGC论文工具给你答案
撰写毕业论文是一项艰巨的任务,AIGC 论文工具的出现为同学们提供了有力支持。以下 6 款工具在功能、适用场景等方面各有优势,助你高效完成毕业论文。 文赋 AI 论文 文赋 AI 论文堪称毕业论文写作的得力助手。它的生成速度令人惊叹,短短 5 分…...

loadingcache优化
问题分析 通过当前现场的火焰图进行分析 原本的loadingcache public LoadingCache<Integer, Student> map Caffeine.newBuilder().refreshAfterWrite(CONTRACT_CACHE_HOURS, TimeUnit.HOURS).maximumSize(CONTRACT_CONFIG_CACHE_SIZE).recordStats().build(key -> …...

【Vue3 Element UI - Plus + Tyscript 实现Tags标签输入及回显】
Vue3 Element Plus TypeScript 实现 Tags 标签输入及回显 在开发后台管理系统或表单页面时,动态标签(Tags) 是一个常见的功能需求。用户可以通过输入框添加标签,并通过关闭按钮删除标签,同时还需要支持标签数据的提…...

STM32 子设备通过CAN发送数据到主设备
采集ADC、GPS经纬坐标、温湿度数据、大气压数据通过CAN方式发送给主设备端,帧ID按照如下定义: 我尼玛一个标准帧ID位数据是11位,扩展帧才是111829位,它说最开头的是四位是真类型,并给我如下解释: 它把帧的定…...

Python可视化——地理空间型图表(自用)
地图信息可视化的实现就是将不可展开的曲面上的地理坐标信息转化为二维平面进行显示,这个过程也叫地图投影(空间三维投影到平面二维) 地图投影的要求:等面积、等角度、等距离。总的来说就是映射到二维平面中的任何点通过比例尺放大…...

WordPress报502错误问题解决-php-fpm-84.service loaded failed failed LSB: starts php-fpm
文章目录 问题描述问题排查问题解决 问题描述 服务器环境: php:8.4MySQL:8.0Nginx:1.26.2 在访问站点时,一直报502,而两天前还能正常访问。 问题排查 导致502的问题很多,比如站点访问量太大…...

Python在SEO中的自动化应用爬虫开发与日志分析实例
引言 搜索引擎优化(SEO)是数字营销中至关重要的一环,旨在提高网站在搜索引擎结果页面(SERP)中的排名。随着互联网数据的爆炸式增长,手动进行SEO分析和管理变得愈发困难。Python作为一种强大的编程语言&…...

thingsboard edge 在windows 环境下的配置
按照官方文档:Installing ThingsBoard Edge on Windows | ThingsBoard Edge,配置好java环境和PostgreSQL。 下载对应的windows 环境下的tb-edge安装包。下载附件 接下来操作具体如下 步骤1,需要先在thingsboard 服务上开启edge 权限 步骤2…...

nnMamba:基于状态空间模型的3D生物医学图像分割、分类和地标检测
摘要 本文提出了一种基于状态空间模型(SSMs)的创新架构——nnMamba,用于解决3D生物医学图像分割、分类及地标检测任务中的长距离依赖建模难题。nnMamba结合了卷积神经网络(CNN)的局部特征提取能力与SSMs的全局上下文建…...

nginx 配置403页面(已亲测)
问题:GET请求访问漏洞url即可看到泄露的内网ip 解决方式: 1.配置nginx 不显示真实Ip 2.限制接口只能是POST请求 具体配置: 编写一个403.html 在nginx的配置文件中,配置location参数: location /api/validationCode…...

SyntaxError: Invalid or unexpected token in JSON at position x
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...

Uncaught TypeError: Cannot read properties of undefined (reading ‘xxx‘)
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...

Nginx 跨域配置详细讲解
一、跨域请求概述 跨域资源共享(CORS,Cross-Origin Resource Sharing)是一种机制,它使用额外的HTTP头部来告诉浏览器让运行在一个origin(域)上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资…...

前端开发基石:HTML语义化深度解析与实践指南
一、语义化设计的本质价值 1.1 从文档结构到信息表达 在Web诞生初期(1991年),HTML仅包含18个标签用于学术文档展示。经过30年发展,HTML5已拥有超过110个标签,其中语义化标签占比提升至60%。这种演进背后是互联网从简…...

mongodb安装教程以及mongodb的使用
MongoDB是由C语言编写的一种面向文档的NoSQL数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案。与传统的关系型数据库(如 MySQL 或 PostgreSQL)不同,MongoDB 存储数据的方式是以 BSON(类似于 JSON 的二进制格式…...

C# 中的多线程同步机制:lock、Monitor 和 Mutex 用法详解
在多线程编程中,线程同步是确保多个线程安全地访问共享资源的关键技术。C# 提供了几种常用的同步机制,其中 lock、Monitor 和 Mutex 是最常用的同步工具。本文将全面介绍这三种同步机制的用法、优缺点以及适用场景,帮助开发者在多线程开发中做…...

【通义万相】蓝耘智算 | 开源视频生成新纪元:通义万相2.1模型部署与测评
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能(AI)通过算法模拟人类智能,利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络(如ChatGPT&…...

期权帮|中证1000股指期权交割结算价怎么算?
期权帮锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 中证1000股指期权交割结算价怎么算? 一、按照最后交易日结算价: (1)计算方法:最后交易日标的指数(…...

Python 面向对象高级编程-定制类
目录 __str__ __iter__ __getitem__ __getattr__ __call__ 小结 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。 __slots__我们已经知道怎么用了,__len__()方法我们也知道是为了能让class作用于len()…...

qt creator示例空白
通常情况下,进入qt后,就会弹出以下窗口: 但如果出现示例空白,那可能是因为 Qt Creator 无法正确识别 Qt 的安装路径或配置。 解决: 点击“添加”: 然后跳转到你的qmake.exe的目录,例如我的qmak…...

MyBatis-Plus 与 Spring Boot 的最佳实践
在现代 Java 开发中,MyBatis-Plus 和 Spring Boot 的结合已经成为了一种非常流行的技术栈。MyBatis-Plus 是 MyBatis 的增强工具,提供了许多便捷的功能,而 Spring Boot 则简化了 Spring 应用的开发流程。本文将探讨如何将 MyBatis-Plus 与 Spring Boot 进行整合,并分享一些…...

TDengine 中的标签索引
简介 本节说明 TDengine 的索引机制。在 TDengine 3.0.3.0 版本之前(不含),默认在第一列 TAG 上建立索引,但不支持给其它列动态添加索引。从 3.0.3.0 版本开始,可以动态地为其它 TAG 列添加索引。对于第一个 TAG 列上…...

工业自动化核心:BM100 信号隔离器的强大力量
安科瑞 吕梦怡 18706162527 BM100系列信号隔离器可以对电流、电压等电量参数或温度、电阻等非电量参数进行快速精确测量,经隔 离转换成标准的模拟信号输出。既可以直接与指针表、数显表相接,也可以与自控仪表(如PLC)、各种 A/D …...

Ascend开发板镜像烧录、联网、其他设备访问
Ascend开发板镜像烧录、联网、外部访问 1.1 Ascend开发板制卡方式一:镜像烧录 SD卡插入读卡器,读卡器插入PC的USB接口 烧录镜像前,先格式化一下SD卡 参考教程:格式化SD卡、修复烧写系统失败的SD卡 WinR,输入cmd DIS…...

Llama-Factory框架下的Meta-Llama-3-8B-Instruct模型微调
目录 引言 Llama - Factory 训练框架简介: Meta - Llama - 3 - 8B - Instruct 模型概述: Lora 方法原理及优势: 原理 优势 环境准备: 部署环境测试: 数据准备: 模型准备: 模型配置与训练࿱…...

MySQL进阶-分析查询语句EXPLAIN
概述 能做什么? 表的读取顺序 数据读取操作的操作类型 哪些索引可以使用 哪些索引被实际使用 表之间的引用 每张表有多少行被优化器查询 官网介绍 https://dev.mysql.com/doc/refman/5.7/en/explain-output.html https://dev.mysql.com/doc/refman/8.0/…...