编译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++ 项目的开发技巧和最佳实践。

最后,如果觉得我的文章对你有帮助,请点赞收藏加关注,谢谢大家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30551.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(十七) Nginx解析:架构设计、负载均衡实战与常见面试问题

什么是Nginx? Nginx 是一款高性能的 HTTP 服务器和反向代理服务器,同时支持 IMAP/POP3/SMTP 协议。其设计以高并发、低资源消耗为核心优势,广泛应用于负载均衡、静态资源服务和反向代理等场景。 一、Nginx 的核心优势 高并发处理能力采用异步非阻塞的…

PCIE接口

PCIE接口 PIC接口介绍PIC总线结构PCI总线特点PCI总线的主要性能PIC的历程 PCIE接口介绍PCIe接口总线位宽PCIE速率GT/s和Gbps区别PCIE带宽计算 PCIE架构PCIe体系结构端到端的差分数据传递PCIe总线的层次结构事务层数据链路层物理层PCIe层级结构及功能框图 PCIe链路初始化PCIe链路…

边缘计算盒子:解决交通拥堵的智能方案

在当今的智能交通系统中,边缘计算盒子(Edge Computing Box)正逐渐成为不可或缺的核心组件。这种设备通过将计算能力下沉到网络边缘,极大地提升了数据处理的速度和效率,特别适用于实时性要求极高的交通监控场景。本文将…

INFINI Labs 产品更新 | Easysearch 增加异步搜索等新特性

INFINI Labs 产品更新发布!此次更新,Easysearch 增加了新的功能和数据类型,包括 wildcard 数据类型、Point in time 搜索 API、异步搜索 API、数值和日期字段的 doc-values 搜索支持,Console 新增了日志查询功能。 INFINI Easyse…

Kotlin从入门到精通:开启高效编程之旅

目录 一、为什么选择 Kotlin 二、Kotlin 基础语法入门​ 2.1 Hello, Kotlin​ 2.2 变量与数据类型​ 2.2.1 可变与不可变变量​ 2.2.2 基本数据类型​ 2.2.3 数组​ 三、Kotlin 流程控制与函数​ 3.1 流程控制语句​ 3.1.1 if 表达式​ 3.1.2 when 表达式​ 3.2 函…

大模型量化技术实践指南:GPTQ、AWQ、BitsandBytes 和 Unsloth

在大模型(LLM)的时代,我们需要了解量化技术,以便在本地电脑上运行这些模型,因为它们的规模非常庞大。然而,实现量化的方法有很多,这让像我这样的初学者很容易感到困惑。本文介绍了我们必须掌握的…

C51 Proteus仿真实验16:4X4矩阵键盘控制条形LED显示

说明 按下的按键值越大点亮的LED越多 Proteus仿真 注意: K1、K5、K9、K13左边引脚连接的是P1.0 K2、K6、K10、K14左边引脚连接的是P1.1 K3、K7、K11、K15左边引脚连接的是P1.2 K4、K8、K12、K16左边引脚连接的是P1.3 K1、K2、K3、K4右边引脚连接的是P1.4 K5、K6、…

Hive的架构

1. 概念 Hive 是建立在 Hadoop 上的数据仓库工具,旨在简化大规模数据集的查询与管理。它通过类 SQL 语言(HiveQL)将结构化数据映射为 Hadoop 的 MapReduce,适合离线批处理,尤其适用于数据仓库场景。 2. 数据模型 表&a…

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 题目 解析代码 题目 解析 首先先让所有的f(i)i,即每个人最开始的祖先都是自己,然后就每一次都让轮到那个数的父亲1,第二次出现的时候就直接用父亲替换掉 并查集适用场景 …

GitHub上传项目

总结(有基础的话直接执行这几步,就不需要再往下看了): git init 修改git的config文件:添加:[user]:name你的github用户名 email你注册github的用户名 git branch -m master main git remote add origin 你的URL gi…

关于Windows输入法切换的一些总结

语言和键盘的关系(第一层是语言 语言下一层是键盘) 如下图:语言就是 中文 英文 阿拉伯文之类的 键盘就是 语言中文下的:XX输入法 语言的切换 和 键盘(输入法)的切换 (用windos空格 可以切换…

C# Unity 唐老狮 No.7 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…

搜广推校招面经三十九

小红书﹣图搜 一、两个整数的汉明距离 两个整数之间的汉明距离是指这两个数字对应二进制位相同位置不同的个数。换句话说,它就是将一个整数变成另一个整数所需要改变的二进制位的数量。例如,如果两个整数在它们的二进制表示中有三个位置上的…

conda list <package> 指令输出的build和channel含义

Build:表示当前安装包的 构建版本,即该包的编译、构建、发布的具体版本。通常包含一些额外的标识,帮助你区分同一包的不同版本。 Channel: 表示该包的 来源渠道,即该包是从哪个 Anaconda 仓库(频道&#…

Windows下配置Flutter移动开发环境以及AndroidStudio安装和模拟机配置

截止 2025/3/9 ,版本更新到了 3.29.1 ,但是为了防止出现一些奇怪的bug,我安装的还是老一点的,3.19,其他版本的安装同理。AndroidStudio用的是 2024/3/1 版本。 — 1 环境变量(Windows) PUB_H…

Linux系统编程--线程同步

目录 一、前言 二、线程饥饿 三、线程同步 四、条件变量 1、cond 2、条件变量的使用 五、条件变量与互斥锁 一、前言 上篇文章我们讲解了线程互斥的概念,为了防止多个线程同时访问一份临界资源而出问题,我们引入了线程互斥,线程互斥其实…

学习小程序开发--Day1

项目学习开篇 项目架构 项目进程 创建uni-app项目 通过HBuilderX创建 小结 page.json 和 tabBar 目录文件 pages.json的配置

在word下写公式

需求 word的可视化编辑公式是好的,但是很丑(见下图) 我希望公式是这样的(见下图) 解决方案 1.先转换为“线性”(即Latex格式) 2.得到下面这个玩意,把\mathrm去掉(功能是…

uniapp,自绘仪表盘组件(基础篇)

文章目录 一、为什么需要自绘仪表盘?二、准备知识三、实现基础仪表盘1. 组件模板结构2. 核心绘制逻辑3. 样式优化 四、使用示例五、核心实现原理六、扩展方向七、常见问题 一、为什么需要自绘仪表盘? 在物联网、数据监控等场景中,仪表盘是常…

导入 Excel 规则批量修改或删除 Excel 表格内容

我们前面介绍过按照规则批量修改 Excel 文档内容的操作,可以对大量的 Excel 文档按照一定的规则进行统一的修改,可以很好的解决我们批量修改 Excel 文档内容的需求。但是某些场景下,我们批量修改 Excel 文档内容的场景比较复杂,比…