
简介这份文档面向需要在 Windows 平台编译 Telegram 桌面客户端的开发者尤其适合具备一定 C 与 VS 工程经验、正在折腾开源 IM 编译环境的中高级读者。内容围绕 Telegram 源码编译全流程展开重点记录了 OpenSSL、LZMA SDK、zlib、libexif 等依赖组件的准备以及 Qt 5.3.1 静态库的编译尝试并针对编译中出现的头文件路径错误、库文件缺失、链接失败等典型问题逐一给出解决思路还涉及 Qt Addin 插件安装与 Telegram 的 Qt 补丁说明。资源包为 1 个 doc 文档大小约 29KB以文字记录与命令片段为主便于对照排查。目前已有 569 人学习下载适合想了解 Telegram 编译链路、积累跨平台构建排错经验的开发者参考可帮助读者少走弯路、快速定位依赖与链接环节的常见坑点。1. Telegram 桌面端编译为什么 QT5.3.1 是绕不开的第一道坎很多人第一次尝试从源码构建 Telegram Desktop都会在 CMake 配置阶段直接翻车——报错信息里反复出现Qt5Core、Qt5Widgets找不到或者版本号对不上。这不是你的操作有问题而是 Telegram Desktop 对 Qt 版本有明确的硬性要求而 QT5.3.1 恰好是官方在早期构建文档中反复提到的一个基准版本。换句话说你想编译 Telegram第一步不是去拉 Telegram 的源码而是先把 QT5.3.1 这个地基打好。这篇文章要解决的问题很具体在 Linux 环境下从零开始编译 Telegram Desktop并且把 QT5.3.1 的编译和配置过程完整走一遍。适合两类人看——一类是刚接触 C 大型项目构建、想拿 Telegram 练手的开发者另一类是在 QT5.3.1 编译过程中已经踩了坑、想找到具体排查路径的工程师。我不会只告诉你“装个 Qt 就行”而是把版本选择、依赖链、编译参数和常见报错的因果关系讲清楚让你在遇到qmake找不到、moc报错、链接阶段缺库的时候知道该往哪个方向查。2. 编译前的环境准备从系统依赖到 QT5.3.1 源码获取2.1 为什么不能直接用系统包管理器里的 QtUbuntu 或 Debian 的 apt 源里通常提供的是 Qt5.9 以上的版本直接apt install qt5-default看起来省事但 Telegram Desktop 在早期版本中对 Qt 的 API 调用有版本敏感性。QT5.3.1 和 Qt5.9 之间在QOpenGLWidget、QSurfaceFormat等模块上有行为差异用高版本 Qt 编译 Telegram 时经常出现编译通过但运行时段错误的情况。更稳妥的做法是从 Qt 官方归档下载 QT5.3.1 的源码包自己编译安装到独立目录避免和系统 Qt 混在一起。常见做法是去 Qt 的 archive 站点找qt-everywhere-opensource-src-5.3.1.tar.gz。下载完成后不要急着解压编译先确认系统里已经装了必要的构建工具和 X11 相关开发库。下面这条命令是我在 Ubuntu 18.04 和 20.04 上都验证过的依赖安装清单sudo apt-get update sudo apt-get install -y build-essential perl python git \ libx11-dev libxext-dev libxrender-dev libxcb1-dev \ libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev \ libxcb-icccm4-dev libxcb-sync0-dev libxcb-xfixes0-dev \ libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev \ libfontconfig1-dev libfreetype6-dev libssl-dev libgl1-mesa-dev \ libglu1-mesa-dev这些库里libxcb-*系列是 Qt 平台插件xcb的编译依赖缺了任何一个都会导致qmake配置阶段报 “xcb disabled”。libssl-dev影响 Qt Network 模块的 SSL 支持Telegram 本身需要 HTTPS 通信所以这个不能省。libgl1-mesa-dev和libglu1-mesa-dev是 OpenGL 相关Telegram 的界面渲染会用到。2.2 QT5.3.1 源码编译的配置参数与安装路径解压源码后进入目录配置命令需要显式指定安装前缀和跳过不需要的模块。QT5.3.1 的configure脚本支持-prefix参数我一般会装到/opt/Qt5.3.1下这样后续 Telegram 编译时通过CMAKE_PREFIX_PATH就能精确指向这个目录不会和系统 Qt 冲突。tar -xzf qt-everywhere-opensource-src-5.3.1.tar.gz cd qt-everywhere-opensource-src-5.3.1 ./configure -prefix /opt/Qt5.3.1 \ -opensource -confirm-license \ -nomake examples -nomake tests \ -skip qtwebkit -skip qtwebkit-examples \ -no-compile-examples \ -qt-zlib -qt-libpng -qt-libjpeg \ -openssl-linked-nomake examples -nomake tests是为了加快编译速度examples 和 tests 对 Telegram 构建没有直接帮助。-skip qtwebkit是因为 QtWebKit 在 5.3.1 里编译耗时极长且 Telegram 桌面端并不依赖它。-openssl-linked让 Qt Network 直接链接系统的 OpenSSL避免运行时找不到 SSL 库。配置完成后执行make -j$(nproc)这个过程在 4 核机器上大约需要 40 到 60 分钟8 核以上会快很多。编译完成后sudo make install然后验证qmake是否可用/opt/Qt5.3.1/bin/qmake -v如果输出显示QMake version 3.0和Using Qt version 5.3.1说明 QT5.3.1 已经就位。这里有个细节不要急着把/opt/Qt5.3.1/bin加到全局 PATH 里因为 Telegram 编译时我们会在 CMake 命令中显式指定 Qt 路径全局 PATH 反而可能干扰其他项目的构建。3. Telegram Desktop 源码编译CMake 配置与依赖处理3.1 拉取源码与子模块初始化Telegram Desktop 的源码托管在 GitHub 上但直接git clone主仓库是不够的它依赖多个子模块包括libtgvoip、GSL、range-v3等。正确的做法是递归克隆git clone --recursive https://github.com/telegramdesktop/tdesktop.git cd tdesktop git submodule update --init --recursive如果克隆过程中子模块拉取失败通常是网络问题导致。可以进入Telegram/ThirdParty目录逐个检查缺哪个补哪个。我遇到过libtgvoip子模块拉不下来导致 CMake 报 “tgvoip not found” 的情况手动进入Telegram/ThirdParty/libtgvoip执行git submodule update --init --recursive就能解决。3.2 CMake 配置命令与 QT5.3.1 路径绑定Telegram Desktop 使用 CMake 作为构建系统配置阶段需要把CMAKE_PREFIX_PATH指向我们刚编译好的 QT5.3.1 安装目录。下面是我常用的配置命令mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease \ -DCMAKE_PREFIX_PATH/opt/Qt5.3.1 \ -DQT_VERSION5.3.1 \ -DTDESKTOP_API_ID你的API_ID \ -DTDESKTOP_API_HASH你的API_HASH \ ..TDESKTOP_API_ID和TDESKTOP_API_HASH是 Telegram 官方 API 的凭证需要去 Telegram 的开发者平台申请。如果没有这两个参数编译出的客户端无法连接服务器。申请过程中常见的telegram api申请失败 error多数是因为填写的应用名称或描述不符合规范换一个简洁的英文名称通常能通过。CMake 配置成功后输出里应该能看到Found Qt5Core、Found Qt5Widgets等行并且版本号显示 5.3.1。如果看到的是系统 Qt 的版本号说明CMAKE_PREFIX_PATH没生效检查路径是否写错或者系统里存在多个 Qt 导致 CMake 优先找到了错误的那个。3.3 编译参数调优与并行加速配置完成后执行make -j$(nproc)开始编译。Telegram Desktop 的代码量不小单核编译可能需要两小时以上。如果机器内存不足 8GB-j后面的数字不要设太大否则会出现c: internal compiler error: Killed这类因为 OOM 导致的编译中断。我一般会留出 2GB 内存给系统比如 8GB 内存的机器用-j416GB 用-j8。编译过程中如果遇到qscintilla相关的报错那通常是因为某个子模块依赖了 QScintilla 库但系统里没有。Telegram 主仓库本身不直接依赖 QScintilla但如果你在编译过程中引入了额外的编辑器组件就需要先编译安装 QScintilla。QScintilla 的编译需要先有 QT5.3.1 的qmake然后执行tar -xzf QScintilla-2.9.1.tar.gz cd QScintilla-2.9.1/Qt4Qt5 /opt/Qt5.3.1/bin/qmake qscintilla.pro make -j$(nproc) sudo make install注意 QScintilla 的版本要和 Qt 版本匹配2.9.x 系列对 Qt5.3 兼容性较好。安装完成后重新运行 Telegram 的 CMake 配置让它能找到 QScintilla 的头文件和库。4. 编译过程中的典型报错与排查路径4.1 qmake 找不到或版本不匹配现象是 CMake 报Could not find a package configuration file provided by Qt5Core或者找到的 Qt 版本是 5.9 而不是 5.3.1。原因通常是CMAKE_PREFIX_PATH没有正确传递或者系统 PATH 里存在另一个qmake干扰了 CMake 的查找逻辑。解决办法分两步第一确认/opt/Qt5.3.1/lib/cmake/Qt5Core/Qt5CoreConfig.cmake文件存在第二在 CMake 命令中显式加上-DQt5Core_DIR/opt/Qt5.3.1/lib/cmake/Qt5Core。如果还是不行临时把系统 Qt 的路径从 PATH 里去掉只保留/opt/Qt5.3.1/bin再重新配置。4.2 moc 或 uic 报错导致编译中断现象是编译到某个moc_*.cpp文件时突然报语法错误或者uic生成的界面代码和源码不匹配。这通常是因为 QT5.3.1 的moc和uic工具版本与 Telegram 源码中使用的 Qt 特性不兼容。Telegram 的某些版本使用了 Qt5.6 以上才引入的宏或信号槽语法用 5.3.1 的 moc 处理就会报错。遇到这种情况先确认你拉取的 Telegram 源码版本是否真的支持 QT5.3.1。早期版本的 Telegram Desktop比如 1.0 到 1.5 之间对 QT5.3.1 支持较好而较新的版本已经要求 Qt5.6 以上。如果源码版本太新要么换用旧版源码要么升级 Qt 版本。我一般会先看CMakeLists.txt里有没有find_package(Qt5 5.3 REQUIRED)这样的版本约束以此判断当前源码是否还兼容 5.3.1。4.3 链接阶段缺少 OpenSSL 或 zlib 符号现象是编译到最后链接可执行文件时报undefined reference to SSL_new或undefined reference to inflate。原因是 QT5.3.1 编译时虽然加了-openssl-linked但 Telegram 自身的链接选项里没有把 OpenSSL 和 zlib 的库带进来。解决办法是在 CMake 配置时加上-DOPENSSL_ROOT_DIR/usr和-DZLIB_ROOT/usr确保 CMake 能找到系统库。如果系统里 OpenSSL 是 1.1.x 而 QT5.3.1 期望的是 1.0.x还会出现符号版本不匹配的问题。这种情况下要么降级 OpenSSL要么在 QT5.3.1 编译时用-openssl而不是-openssl-linked让 Qt 在运行时动态加载 SSL 库。4.4 编译内存不足导致进程被杀死现象是make执行到某个大型.cpp文件时突然报Killed终端没有其他错误信息。这是 Linux OOM Killer 在内存耗尽时杀掉了编译器进程。Telegram 的mainwidget.cpp和historywidget.cpp都是几千行的大文件编译时单个进程可能占用 1.5GB 以上内存。解决办法有两个一是减少并行编译数把-j8降到-j2甚至-j1二是临时增加交换分区用sudo fallocate -l 4G /swapfile sudo mkswap /swapfile sudo swapon /swapfile加 4GB swap编译完再关掉。我一般会在编译前先free -h看一下可用内存低于 4GB 就直接用-j1虽然慢但不会中断。4.5 运行时报 xcb 插件加载失败现象是编译成功但运行 Telegram 时弹窗提示This application failed to start because it could not find or load the Qt platform plugin xcb。原因是 QT5.3.1 的 xcb 平台插件没有正确安装或者运行时找不到插件路径。解决办法是设置QT_QPA_PLATFORM_PLUGIN_PATH环境变量指向 Qt 插件目录export QT_QPA_PLATFORM_PLUGIN_PATH/opt/Qt5.3.1/plugins/platforms如果这个目录下没有libqxcb.so说明 QT5.3.1 编译时 xcb 模块被跳过了。回到 Qt 源码目录检查configure输出里有没有xcb相关的 “yes”如果没有需要补装libxcb-*开发库后重新配置编译 Qt。5. 编译产物的验证与 QT5.3.1 环境下的运行调试编译完成后build目录下会生成Telegram可执行文件。直接运行之前先确认动态链接库的搜索路径包含 QT5.3.1 的 lib 目录export LD_LIBRARY_PATH/opt/Qt5.3.1/lib:$LD_LIBRARY_PATH ./Telegram如果启动后界面正常显示但登录时收不到验证码这通常和网络环境有关不是编译问题。Telegram 的验证码通过短信或已登录设备发送如果账号之前没有在其他设备登录过短信验证码可能因为运营商过滤而延迟。这种情况可以尝试用已登录的 Telegram 移动端接收验证码或者在登录界面选择“通过通话获取验证码”。验证编译是否真正成功不能只看能不能启动。我一般会做三个检查第一ldd Telegram | grep Qt5确认链接的是/opt/Qt5.3.1/lib下的库而不是系统库第二在 Telegram 设置里查看“关于”页面确认版本号和编译时间第三发一条消息并检查是否能正常同步到其他设备。这三个都通过才算编译产物真正可用。还有一个容易被忽略的点QT5.3.1 默认使用 GTK 主题样式在某些桌面环境下界面会显得字体模糊或控件错位。可以在启动时加-style fusion参数强制使用 Fusion 样式界面会正常很多./Telegram -style fusion如果需要在没有图形界面的服务器上编译但最终在桌面环境运行编译时不需要额外配置但运行时必须确保 X11 转发或本地桌面会话可用。纯 SSH 环境下直接运行会报 “cannot connect to X server”这是预期行为不是编译错误。我在多次编译 Telegram 的过程中最大的教训是不要混用系统 Qt 和自编译 Qt。一旦 CMake 缓存里记录了错误的 Qt 路径后续再怎么改参数都可能不生效。遇到诡异问题时直接删掉build目录重新配置比在旧缓存上修修补补快得多。希望帮到你。本文还有配套的精品资源点击获取