编译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 是最常用的同步工具。本文将全面介绍这三种同步机制的用法、优缺点以及适用场景,帮助开发者在多线程开发中做…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
