尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Qt6源码编译安装Linguist语言家完整教程

Qt6源码编译安装Linguist语言家完整教程 Qt6 源码都拉下来之后才知道 linguist 这货其实藏得很深。很多人以为编译完 qtbase 就有“语言家”了结果翻遍 bin 目录只看到 lupdate、lrelease就是找不到 Linquist 图形界面。这篇就把 Qt6 源码编译安装 linguist 语言家的完整路子走一遍从模块划分、依赖准备、qtbase 地基编译到单独把 qttools 里的 linguist 目标抠出来构建最后再给你一套能直接抄的翻译工作流。1. 先搞清楚你要的到底是哪个 linguist1.1 Qt6 里 Linguist 和 Qt5 不一样了如果你用过 Qt5可能记得安装完整个 Qt 套件后bin 目录里linguist、lupdate、lrelease是齐刷刷待在一起的。但 Qt6 对源码结构做了不少调整这些翻译工具被拆到了两个不同的模块里lupdate、lrelease、lconvert这些命令行工具被挪进了qtbase模块图形界面的 Linguist也就是中文叫“语言家”的那个翻译编辑器则单独留在qttools模块里。这个拆分直接影响编译策略。如果你只想要图形界面版的语言家光是编译安装 qtbase 是不够的还必须额外处理 qttools 模块。反过来说如果你的项目只是在 CI 流程里用 lupdate 扫描字符串、用 lrelease 生成 qm 文件那编译完 qtbase 就已经够用了根本不需要动 qttools。很多教程一上来就引导新手跑git clone拉全量 Qt6 源码再执行一大段包含十几个模块的 configure 命令最后编译四五个小时。这种方案对只想用语言家工具的人来说纯属浪费时间。你真正需要的只是两个仓库qtbase 和 qttools。1.2 三个命令各干各的活在动手编译之前建议先把三个核心工具的关系理清楚后面用起来才不会乱lupdate扫描源代码里的tr()、trUtf8()、qsTr()等可翻译字符串提取生成.ts文件。这个文件是 XML 格式可以直接用文本编辑器打开但正常人不会那么干。linguist图形化翻译编辑器也就是标题里说的“语言家”。它负责打开.ts文件逐条把源语言翻译成目标语言处理模糊匹配、上下文提示等。翻译结果还是保存在.ts文件里。lrelease把翻译好的.ts文件编译成二进制的.qm文件运行时由QTranslator加载这才是程序真正使用的翻译文件。简单类比一下lupdate 相当于从一堆书中把所有需要翻译的句子摘抄出来做成清单linguist 是人工对照清单逐条翻译lrelease 则是把翻译好的清单打包成程序能快速查表读懂的字典。三者缺一不可。2. 环境准备与源码选择2.1 依赖清单照着装不会错编译 Qt6 最烦的不是编译本身是依赖缺失。好在 qtbase 的 configure 脚本对依赖的处理比较宽容——缺某个库它会自动 disable 对应功能而不是直接报错。这种设计有好处也有坏处好处是你能顺利完成编译坏处是编译完发现 xcb 平台插件没装上程序跑不起来那时候再回头补依赖更折腾。我建议编译前先把常用依赖一次性装齐省得后面排查。Ubuntu/Debian 系可以参考这份清单sudo apt update sudo apt install build-essential ninja-build cmake perl python3 \ libgl1-mesa-dev libxkbcommon-dev libfontconfig1-dev \ libdbus-1-dev libssl-dev libicu-dev \ libxcb1-dev libxcb-cursor-dev libxcb-glx0-dev \ libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev \ libxcb-randr0-dev libxcb-render-util0-dev libxcb-shape0-dev \ libxcb-xfixes0-dev libxcb-xkb-dev libxcb-xinerama0-dev这里面的 xcb 相关开发包尤其重要它决定编译出来的 Qt6 程序能不能在 Linux 桌面环境里正常显示窗口。如果不装configure 会禁用 xcb 插件后面你运行任何 Qt6 GUI 程序都会提示 could not find a platform plugin 之类的错误。Windows 上的依赖不太一样。首先你需要一个 MSVC 编译器Visual Studio 2022 的 Build Tools 就够然后装好 CMake、Ninja、Perl推荐 Strawberry Perl、Python。需要注意的是在 Windows 上编译 Qt6 必须在“x64 Native Tools Command Prompt for VS 2022”里进行不能直接在普通 PowerShell 里跑否则找不到 cl.exe。2.2 源码获取只拉两个仓库就够了Qt6 源码在 Git 仓库里是拆分的qtbase、qttools、qtdeclarative 等都是独立仓库。用git clone拉取时没必要把整个 Qt 全拉下来两个仓库足以覆盖语言家工具链mkdir -p ~/qt6-src cd ~/qt6-src git clone https://code.qt.io/qt/qtbase.git -b v6.5.3 --depth 1 git clone https://code.qt.io/qt/qttools.git -b v6.5.3 --depth 1这里有几个经验之谈。第一--depth 1只拉最新提交能省大量时间和磁盘空间。完整历史和源码快照体积差别很大不调试 Qt 自身源码的话单分支浅克隆足够。第二分支参数建议用官方标签比如v6.5.3、v6.6.0而不是dev分支。dev 分支是滚动更新的代码每天都在变编译过程中出现问题你没处查。第三国内网络访问 code.qt.io 速度可能不理想可以用镜像地址。GitHub 上 Qt 官方账号也维护了镜像仓库https://github.com/qt/qtbase.git和https://github.com/qt/qttools.git拉取速度通常更快。2.3 编译选项的取舍Qt6 官方的编译方式是先进入 qtbase 目录执行 configure 脚本它内部会调用 CMake 生成构建系统。这里有几个关键选项需要了解-prefix /opt/Qt6指定安装路径。这个必须设置否则默认装到系统目录后续管理版本很不方便。我个人习惯装到/opt/Qt6这类自定义目录这样系统里不同版本的 Qt 可以共存哪个项目的 CMakeLists 指定哪个 prefix 就用哪个。-release只编译发布版不做 Debug。调试 Qt 自身代码的人除外正常人不需要编译两遍。-opensource -confirm-license接受开源协议否则 configure 会停在协议确认环节。-nomake examples -nomake tests不编译示例和测试代码能省下不少时间。-skip qtwebengine如果你在 Qt6 源码根目录用-submodules方式构建这个参数能跳过最耗时的 WebEngine 模块。但对于我们只拉 qtbase、qttools 两个仓库的方案这一步本来就不存在。configure 并不是只能用在 qtbase。如果你拉取了完整的 Qt6 源码树那种所有模块平铺在一个父目录下的结构也可以用类似方式整体配置所有模块。这里先介绍最省事的路径。3. 编译安装 qtbaseLinguist 的地基3.1 configure 阶段到底发生了什么进入 qtbase 目录执行 configure 后脚本会做几件事检测编译器和依赖库、确定支持哪些平台插件和功能、生成 CMakeCache.txt、创建构建目录。这一步不需要你手动再跑一次 cmakeconfigure 内部会把 CMake 的配置流程走完。所以如果你对 CMake 不熟也不用慌configure 脚本就是 Qt 官方帮你封装好的一层“傻瓜式配置器”。它输出的日志非常长一行行检查各种库。你只需要关注最后几行有没有出现 ERROR 或者 WARNING 即可。有一个坑必须提醒configure 过程依赖 Python 和 Perl且版本不能太老。Ubuntu 22.04 自带的 Python 3.10、Perl 5.34 都够用。如果你是在精简容器环境里编译记得先把这两个装上。3.2 实测命令与参数说明cd ~/qt6-src/qtbase ./configure -prefix /opt/Qt6 \ -release \ -opensource \ -confirm-license \ -nomake examples \ -nomake tests配置完成后开始编译。建议先确认 CPU 核心数并行编译能大幅缩短时间nproc cmake --build . -j$(nproc)整个 qtbase 的编译时间取决于机器性能。8 核以上的机器大概 20 到 40 分钟4 核笔记本可能要一个小时以上。编译期间不用担心报错——只要依赖装齐了通常都能顺畅跑完。编译完成后再安装sudo cmake --install .这里说明一下直接在 qtbase 目录执行cmake --build .会读取 configure 生成的 CMakeCache构建目录就是 qtbase 本身。如果编译中途出了问题想重新开始可以删掉 CMakeCache.txt 和 CMakeFiles 目录再执行 configure不要重复在同一个目录里叠加配置。3.3 安装后的路径检查安装完成后/opt/Qt6/bin目录下应该能看到我们熟悉的几个翻译命令行工具ls /opt/Qt6/bin你应该能看到lconvert、lupdate、lrelease以及 moc、uic、rcc 等工具。顺手验证一下版本/opt/Qt6/bin/lrelease --version能正常输出版本号说明 qtbase 编译成功。这时候命令行翻译工具链已经可以用了lupdate 扫描源码、lrelease 生成 qm 文件都没问题。目标 linguit 图形界面还没出现它住在 qttools 里需要单独伺候。记得把安装目录加入 PATH方便后面使用export PATH/opt/Qt6/bin:$PATH想永久生效就写到~/.bashrc或~/.zshrc里。4. 单独编译 Linguist 语言家qttools 的精准打击4.1 为什么要进 qttools 而不是全量构建qttools 模块包含的不只是 linguist还有 Qt Designer界面设计器、Qt Assistant帮助文档、qtattributionsscanner 等一整套工具。如果直接在整个构建目录下执行cmake --build .会把所有这些工具全部编译一遍耗时又占空间。但 linguist 是独立的 CMake target这意味着你完全可以在配置好之后只构建这一个目标。我实测过在只构建 linguist 的情况下从配置到安装完成只需要几分钟。这样做的额外好处是避免编译其他工具时遇到的环境问题比如 qtattributionsscanner 对 Python 路径敏感、Qt Designer 需要额外图形相关依赖等。所以我们的策略很明确配置整个 qttools 的 CMake 工程但构建阶段只指定 linguist 这一个 target。4.2 CMake 配置与单独构建 linguist 目标cd ~/qt6-src/qttools cmake -S . -B build-linguist \ -DCMAKE_PREFIX_PATH/opt/Qt6 \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_INSTALL_PREFIX/opt/Qt6 cmake --build build-linguist --target linguist -j$(nproc)CMAKE_PREFIX_PATH这个参数是重中之重。qtbase 安装到了/opt/Qt6qttools 的 CMake 配置阶段需要找到 Qt6Config.cmake、Qt6Core、Qt6Gui 等包文件而这些文件默认分布在/opt/Qt6/lib/cmake下。你不告诉 CMake 这个路径它就只能到默认系统路径里找找不到就直接报错。构建完成后安装cmake --install build-linguist因为配置时已经指定了CMAKE_INSTALL_PREFIX/opt/Qt6所以这里装完linguist 就直接进入/opt/Qt6/bin/linguist。验证一下/opt/Qt6/bin/linguist -version看到版本号输出语言家就算是安装成功了。4.3 启动与中文界面设置直接运行linguist默认界面语言通常是英文。想要变回标题里说的“语言家”中文界面需要设置正确的 localeexport LANGzh_CN.UTF-8 export LANGUAGEzh_CN.UTF-8 /opt/Qt6/bin/linguist或者更简洁的写法LANGUAGEzh_CN.UTF-8 /opt/Qt6/bin/linguistQt 的应用程序会根据系统的 locale 自动加载对应的翻译文件qttools 安装时会一并把语言家界面翻译文件linguist_zh_CN.qm 等放到/opt/Qt6/translations目录下。只要 locale 对上了界面就会自动切到中文。如果系统里没有zh_CN.UTF-8这个 locale可以用locale -a查看再通过sudo locale-gen zh_CN.UTF-8生成。这个细节容易漏很多人编译完语言家发现永远是英文界面其实不是软件问题是系统 locale 没配好。5. 在 Qt6 项目里用上 Linguist 工作流5.1 一个最小翻译示例说实话装好语言家只是万里长征第一步真正让它发挥价值的是整套翻译工作流。这里用一个最小示例演示。假设你要做一个 Qt6 音乐播放器很多初学者入门项目就选这个界面里有个“Play”按钮需要支持中文、英文切换。先准备一个最简单的项目cmake_minimum_required(VERSION 3.16) project(myplayer VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt6 REQUIRED COMPONENTS Widgets LinguistTools) qt_standard_project_setup() qt_add_executable(myplayer main.cpp) qt_add_translations(myplayer TS_FILES i18n/myplayer_zh_CN.ts )main.cpp 内容#include QApplication #include QPushButton #include QTranslator #include QLocale #include QString int main(int argc, char *argv[]) { QApplication app(argc, argv); QTranslator translator; if (translator.load(QLocale(), myplayer, _, i18n)) { app.installTranslator(translator); } QPushButton button(QObject::tr(Play)); button.resize(160, 60); button.show(); return app.exec(); }这里的关键是用QObject::tr(Play)包住所有需要翻译的字符串。tr 是 Qt 翻译机制的入口lupdate 扫描的就是这一类带 tr 包裹的字符串。5.2 lupdate、linguist、lrelease 全流程构建前先手动执行一次 lupdate生成 ts 文件mkdir -p i18n /opt/Qt6/bin/lupdate . -ts i18n/myplayer_zh_CN.ts这行命令会递归扫描当前目录下的源码把可翻译字符串提取进 ts 文件。用文本编辑器打开这个文件能看到类似这样的结构context nameMainWindow/name message sourcePlay/source translation typeunfinished播放/translation /message /context然后用语言家打开这个 ts 文件/opt/Qt6/bin/linguist i18n/myplayer_zh_CN.ts在图形界面里逐条填写翻译保存后关闭。最后用 lrelease 生成二进制 qm 文件/opt/Qt6/bin/lrelease i18n/myplayer_zh_CN.ts -qm i18n/myplayer_zh_CN.qm程序运行时translator.load(QLocale(), myplayer, _, i18n)会在 i18n 目录下寻找与当前 locale 匹配的 qm 文件比如中文系统就是 myplayer_zh_CN.qm找到后自动替换界面文字。5.3 现代 CMake 推荐用法上面手动跑的流程适合理解原理。实际项目里5.1 里那种qt_add_translations才是更推荐的做法。这个 CMake 函数会自动把 lupdate、lrelease 挂到构建流程里你每次重新构建项目时ts 文件里有新增的字符串会被自动提取qm 文件会被自动生成完全不用手工操作。前提只有一个find_package时必须引入LinguistTools组件。这也是为什么刚才在 CMakeLists 里写了find_package(Qt6 REQUIRED COMPONENTS Widgets LinguistTools)。这个组件对应的就是 qtbase 里的 lupdate、lrelease 工具再次证明编译 qtbase 的价值所在。6. 常见问题与排查实录6.1 configure 报错或检查不通过现象configure 中途报错显示缺少 Python 或 Perl或者提示某个库版本太低。解决方法分两步。先确认依赖有没有装全对照第 2.1 节的清单逐项排查。另外检查系统默认的 cmake 版本Qt6 对 CMake 版本有最低要求一般 3.16 以上较新的 Qt 版本要求 3.21Ubuntu 20.04 自带的 cmake 3.16 在编译 Qt6.6 或更高版本时可能不够用需要装新版sudo apt install cmake cmake --version如果版本太低可以去 CMake 官网下载预编译的二进制包或者用pip install cmake装一个更新版本然后把它加入 PATH 放在系统 cmake 前面。6.2 qttools 配置时找不到 Qt6 包现象执行 cmake 配置 qttools 时报错提示Could not find a package configuration file provided by Qt6 with any of the following names: Qt6Config.cmake qt6-config.cmake这个原因基本可以锁定为CMAKE_PREFIX_PATH没指定或者指错了。Qt6 的 CMake 包文件安装位置是prefix/lib/cmake所以要让 CMake 能发现 Qt6至少要让它去/opt/Qt6/lib/cmake找。设置-DCMAKE_PREFIX_PATH/opt/Qt6是最直接的做法。还有一种情况是你指定了 prefix但 qtbase 还没安装或者安装路径里的文件被清理过。检查一下/opt/Qt6/lib/cmake/Qt6/Qt6Config.cmake是否存在即可确认。6.3 编译时间太长怎么优化先把不必要的模块跳过去。我们的最小方案只拉了 qtbase、qttools天然就比全量编译省很多。如果你已经拉了一大堆模块构建时又不需要它们可以只进入 qtbase 或 qttools 目录单独构建不要在图省事的情况下在源码根目录跑./configure。另外-j参数不要盲目调到很高。编译 Qt6 时每个编译单元内存消耗不低-j$(nproc)在 16 核服务器上可能把内存吃满导致 OOM。实测经验是内存 8GB 的机器用-j416GB 用-j8比较稳妥。还有一个技巧是让 configure 只生成 ninja 构建文件Ninja 比 make 在增量编译和并行度上强不少Ubuntu 上装了 ninja-build 后 Qt6 默认就会选 Ninja 作为生成器。6.4 linguist 启动后是英文界面这是所有人都会遇到一次的问题。优先执行LANGUAGEzh_CN.UTF-8 /opt/Qt6/bin/linguist如果依然英文用locale -a看系统是否生成了 zh_CN.UTF-8。没有就执行sudo locale-gen zh_CN.UTF-8再检查/opt/Qt6/translations下有没有linguist_zh_CN.qm。有些发行版在安装时可能漏掉 translations 数据如果缺失可以把 qttools 源码目录下translations/linguist_zh_CN.qm手动复制到/opt/Qt6/translations下。6.5 lrelease 命令找不到如果你已经编译安装了 qtbase但 shell 提示lrelease: command not found大概率是 PATH 没配好。确认安装前缀比如/opt/Qt6/bin然后export PATH/opt/Qt6/bin:$PATH注意是追加而不是覆盖$PATH不能丢。写进 shell 配置文件之后要source一下或者重开终端才会生效。这组工具链我实际用下来的最大感受是lupdate、lrelease 这两个命令行工具才是日常构建的主心骨 linguist 图形界面只在人工翻译、校对的时候点亮一下。源码编译安装语言家的好处是你能拿到和当前 Qt 版本完全匹配的工具不会出现 Qt5 时代 lrelease 和运行库版本错位导致的诡异报错。编译过程虽然看起来步骤多但模板固定踩过一次坑之后你就会觉得它比发行版仓库里那些散装的 Qt 工具靠谱得多。
返回列表