1. 环境准备:从零开始的ARM编译基础
在银河麒麟V11 ARM架构的机器上折腾Qt Creator,这事儿我干过好几次了,每次都能遇到新问题。如果你也是第一次在国产ARM平台上编译Qt,那我得先给你打个预防针——这和你在x86的Ubuntu上编译完全是两码事。ARM架构的生态,特别是像飞腾、鲲鹏这类国产CPU,很多软件包的依赖关系都跟主流的x86发行版不太一样,这也是为什么网上那些通用的Qt编译教程在这里经常失灵的原因。
首先,你得搞清楚你的系统到底装了什么。打开终端,先看看系统的基本信息:
uname -a cat /etc/os-release我遇到的大多数银河麒麟V11 ARM版本,内核都是基于Linux 4.19或者5.x的,系统标识里通常会有“kylin”和“aarch64”字样。确认了系统架构,接下来就是准备编译环境。这里有个关键点:银河麒麟V11的软件源里,很多开发包的版本都是定制的,比如libicu(国际化组件)的版本号后面会带“ok6k0.3”这样的后缀,而官方LLVM套件依赖的可能是“ok6k0.2”。就是这种微小的版本号差异,会导致后面安装依赖时出现让人头疼的冲突。
所以,第一步不是急着下载源码,而是先把基础的编译工具链装齐了。下面这条命令是我实测下来比较全的,能覆盖编译Qt和Qt Creator的基本需求:
sudo apt-get update sudo apt-get install build-essential perl python3 git \ libglib2.0-dev libgl1-mesa-dev libx11-dev libxext-dev \ libxcb1-dev libxcb-xinerama0-dev libxcb-xfixes0-dev \ libfontconfig1-dev libfreetype6-dev libxrender-dev \ libxkbcommon-dev libxkbcommon-x11-dev装完这些,建议再检查一下CMake的版本。Qt Creator 8.0.2对CMake版本有一定要求,太旧的版本可能无法正确识别一些新的特性。用cmake --version看看,如果是3.16以上,基本就够用了。如果版本太低,你可能需要去CMake官网下载新版源码自己编译一个,这又是另一个故事了。
最后,给自己准备一个干净的工作目录。我习惯在用户目录下创建一个qt_build文件夹,把所有源码和构建中间文件都放里面,这样管理起来方便,出了问题也好清理。记住,在ARM平台上编译,耗时远比x86长,做好心理准备,泡杯茶,咱们慢慢来。
2. 编译Qt 5.15.10:打好地基是关键
编译Qt Creator之前,必须先有一个编译好的Qt库。这就好比你要盖房子(Qt Creator),得先有砖头和水泥(Qt库)。官方预编译的二进制包基本都是给x86_64的,ARM平台下,尤其是银河麒麟这种定制系统,几乎百分之百需要你自己从源码编译Qt。我选择Qt 5.15.10这个长期支持版本,因为它足够稳定,和Qt Creator 8.0.2的兼容性也经过了验证。
首先去国内镜像站下载源码,速度会快很多。南京大学的镜像就很不错:
wget https://mirrors.nju.edu.cn/qt/archive/qt/5.15/5.15.10/single/qt-everywhere-opensource-src-5.15.10.tar.xz下载完成后,解压并进入目录:
tar xf qt-everywhere-src-5.15.10.tar.xz cd qt-everywhere-src-5.15.10接下来是关键的一步:配置。配置参数决定了最终编译出来的Qt库包含哪些功能。对于只是用来支撑Qt Creator编译和运行的环境,我们不需要例子和测试程序,这样可以节省大量编译时间。我常用的配置命令如下:
mkdir build && cd build ../configure -prefix /opt/qt5.15.10 \ -opensource \ -confirm-license \ -nomake examples \ -nomake tests \ -qt-xcb \ -opengl desktop这里有几个参数需要解释一下。-prefix /opt/qt5.15.10指定了安装路径,我习惯放在/opt下面,方便管理,权限也清晰。-qt-xcb这个参数在银河麒麟的桌面环境下非常重要,它告诉Qt使用xcb(X协议)后端来处理图形界面,这是兼容UKUI桌面所必须的。如果不加这个参数,你可能会遇到各种奇怪的图形显示问题,甚至编译失败。-opengl desktop则是为了启用桌面版的OpenGL支持。
配置命令执行后,会输出一大段摘要,仔细看看有没有报错,特别是关于哪些模块被跳过了。确认无误后,就可以开始漫长的编译了。使用make -j$(nproc)可以让编译过程利用你CPU的所有核心,在飞腾或鲲鹏的8核、16核机器上,这个提速效果非常明显。不过,ARM架构的编译速度相比同代x86还是要慢一些,我的一台飞腾2000机器,编译整个Qt 5.15.10花了将近4个小时。
编译完成后,用sudo make install安装到之前指定的/opt/qt5.15.10目录。最后,别忘了把Qt的路径加到环境变量里,否则系统找不到它:
echo 'export PATH=/opt/qt5.15.10/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/opt/qt5.15.10/lib:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc执行完这些,运行qmake -v看看,如果能正确显示Qt 5.15.10的版本信息,那么恭喜你,最耗时、最基础的一步已经完成了。这个自编译的Qt库,就是我们后续编译Qt Creator的“地基”。
3. 编译Qt Creator 8.0.2:直面依赖冲突的挑战
地基打好了,现在开始盖房子——编译Qt Creator 8.0.2。这一步才是真正考验人的地方,你会遇到在x86平台上几乎不会出现的各种依赖问题。首先,同样是从镜像站下载源码:
wget https://mirrors.nju.edu.cn/qt/archive/qtcreator/8.0/8.0.2/qt-creator-opensource-src-8.0.2.tar.xz tar xvf qt-creator-opensource-src-8.0.2.tar.xz cd qt-creator-opensource-src-8.0.2 mkdir build && cd build按照常规流程,接下来应该安装编译依赖,特别是LLVM/Clang相关的开发包,因为Qt Creator的代码模型、格式化、静态分析等高级功能都依赖它们。然而,在银河麒麟V11上,你会立刻撞上第一堵墙。执行sudo apt install llvm-17-dev libclang-17-dev clang-17后,大概率会看到这样的错误:
下列软件包有未满足的依赖关系: libicu-dev : 依赖: libicu74 (= 74.2-ok6k0.2) 但是 74.2-ok6k0.3 正要被安装这就是我开头提到的版本号“魔咒”。系统自带的libicu74是74.2-ok6k0.3,而llvm-17-dev这个包要求依赖的版本是74.2-ok6k0.2。APT包管理器非常死板,版本号必须完全匹配,差一个小尾巴都不行。这种由系统定制带来的微小版本差异,是国产化平台开发中最常见的“坑”之一。
面对这种情况,通常有两种思路。第一种是“硬刚”,尝试寻找或自己打包一个版本号完全匹配的libicu74包替换掉系统的。但这非常危险,可能会破坏系统其他软件的依赖,导致系统不稳定。第二种思路就是“绕过去”,这也是我推荐的做法:既然Clang插件装不上,那我们暂时先不用它。Qt Creator的核心编辑和构建功能并不强制依赖Clang,只有代码补全、ClangFormat、Clang-Tidy等高级功能需要。对于初次编译和基础使用,我们可以先禁用这些插件,把主体编译出来,功能能用起来再说。
于是,我们的CMake配置命令就需要加上一系列禁用Clang的选项:
cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_PREFIX_PATH=/opt/qt5.15.10 \ -DWITH_CLANG=OFF \ -DWITH_CLANG_FORMAT=OFF \ -DWITH_CLANG_TIDY=OFF \ -DWITH_CLAZY=OFF \ -DWITH_TESTS=OFF然而,事情并没有那么简单。即使你告诉CMakeWITH_CLANG=OFF,CMake在配置过程中依然会去尝试寻找Clang相关的包,因为源码里的一些CMake脚本逻辑是写死的。这时候,你会遇到第二个错误,提示找不到LLVMConfig.cmake或者类似的信息。这说明,仅仅通过CMake命令行参数禁用还不够,我们需要更“暴力”一点的方法,直接修改源码里的CMake脚本,让它彻底放弃寻找Clang。
4. 修改CMake脚本:让编译流程“忘记”Clang
当CMake报错,提示找不到LLVM时,就意味着我们需要手动干预编译系统的查找逻辑了。别怕,这听起来很底层,其实操作起来就是修改几个文本文件。首先,找到Qt Creator源码目录下的顶级CMakeLists.txt文件,用你喜欢的编辑器(比如vim或nano)打开它。
搜索find_package(Clang相关的语句。在8.0.2版本中,大概在第100行左右,你会看到类似find_package(Clang QUIET)的代码。我们的目标就是让这一行失效。最直接的办法是把它注释掉,并在后面加一句设置变量为OFF:
# find_package(Clang QUIET) set(Clang_FOUND OFF)这样修改后,CMake在配置时就会认为Clang没有被找到,从而跳过所有依赖于Clang的模块。但是,这还不够。因为Qt Creator的源码树里,还有很多子模块的CMakeLists.txt文件也会尝试查找Clang。我们需要找到并修改其中最关键的两个。
第一个是cmake/FindClang.cmake文件。这个文件是Qt Creator自定义的,用来查找Clang库的模块。我们直接在这个文件的开头,加入两行“终结”代码:
# 在文件最开头添加 set(Clang_FOUND OFF) return()set(Clang_FOUND OFF)明确告诉CMake“没找到Clang”,紧接着return()让这个查找模块立刻退出,不再执行后面任何查找逻辑。这相当于给这个模块装了个“短路开关”。
第二个需要修改的是src/plugins/clangformat/CMakeLists.txt。这个目录是ClangFormat插件的构建定义,即使顶层禁用了,它自身的构建脚本可能还会被执行。为了保险起见,我们同样在这个文件的开头加上return(),让CMake直接跳过这个目录的所有内容:
# 在文件最开头添加 return()完成这三处修改后,再次回到你的构建目录(build),务必先清理掉之前失败的CMake缓存,这是非常关键的一步。执行rm -rf *或者rm -rf CMakeCache.txt CMakeFiles/,然后重新运行CMake配置命令。这次,你应该能看到配置过程顺利走完,最后输出-- Build files have been written to: ...的成功信息。看到这行字,心里的一块大石头就算落地了,最棘手的依赖问题已经被你绕过去了。
5. 执行编译与安装:耐心等待胜利的曙光
配置成功只是万里长征走完了一半,接下来是更耗时的编译环节。在ARM平台上编译像Qt Creator这样的大型C++项目,是对你机器性能和耐心的一次双重考验。我的建议是,找一个你不需要用电脑的时间段,比如晚上睡觉前,开始编译。
使用CMake的构建命令,并指定并行编译的线程数,可以最大化利用CPU资源:
# 先查看你的CPU有多少个核心 nproc # 假设输出是8,则使用8个线程并行编译 cmake --build . --parallel 8这里我用了cmake --build .而不是简单的make,这是一种更现代、更通用的构建方式,尤其当你项目用的是CMake时。--parallel 8参数告诉构建系统同时跑8个编译任务。根据我的经验,在飞腾2000/4(4核)的机器上,这个过程可能需要1.5到2个小时;在鲲鹏920(64核)的服务器上,可能20-30分钟就能完成。编译过程中,终端会不断滚动输出信息,只要没有出现红色的错误(Error)提示,就让它安心跑着。
编译完成后,你会看到Built target qtcreator这样的成功信息。接下来就是安装了,安装路径可以在CMake配置时通过-DCMAKE_INSTALL_PREFIX指定,如果没指定,默认会安装到/usr/local下。我习惯把它安装到/opt目录,和Qt库放在一起,管理起来一目了然。安装命令很简单:
sudo cmake --install . # 或者,如果你在配置时指定了安装前缀 # sudo cmake --install . --prefix /opt/qtcreator-8.0.2安装过程很快,几秒钟就完成了。这时候,理论上你已经可以在终端输入qtcreator来启动它了。但是,先别急,还有一个非常重要的收尾工作没做,不做的话,你很可能点开Qt Creator的图标,它却闪退或者根本启动不了。
6. 配置运行时库路径:解决“找不到库”的经典问题
我们自己编译的Qt库安装在/opt/qt5.15.10/lib,这个路径并不在系统默认的库文件搜索范围之内。当Qt Creator启动时,它需要加载Qt的核心库(比如libQt5Core.so.5,libQt5Widgets.so.5),如果系统找不到这些库,程序就会崩溃。这就是典型的“运行时链接器”问题。
解决这个问题,就是告诉系统的动态链接器,去哪里找我们自编译的库。有两种方法,我推荐第一种更持久、全局生效的方法:创建配置文件。
首先,创建一个新的配置文件:
sudo nano /etc/ld.so.conf.d/qt515.conf在这个新文件里,只需要写一行,就是我们Qt库的路径:
/opt/qt5.15.10/lib保存退出后,需要让系统重新加载这个配置,更新链接器的缓存:
sudo ldconfig执行完sudo ldconfig后,系统就会把/opt/qt5.15.10/lib这个路径加入到它的库搜索列表里。现在,再尝试启动Qt Creator。你应该能看到熟悉的启动画面,然后进入主界面。
如果一切顺利,你可以在Qt Creator的“帮助”->“关于Qt Creator”里看到版本是8.0.2,在“工具”->“选项”->“Kits”里,应该能自动检测到我们安装在/opt/qt5.15.10下的Qt 5.15.10。至此,一个在银河麒麟V11 ARM架构上完全从源码编译出来的Qt Creator开发环境就搭建成功了。虽然我们暂时禁用了Clang相关的高级功能,但它已经具备了代码编辑、项目管理、构建、运行和调试等核心功能,完全可以用来进行日常的Qt项目开发了。后续如果你需要代码补全等功能,可以再慢慢研究如何解决那个libicu的依赖冲突,或者寻找其他替代方案,但至少现在,你已经有了一个能用的、强大的IDE。