Qt6静态编译(一):Linux编译
Qt挺好用的,但是静态编译使人头大,这里记录一下Linux上咋静态编译(Windows上下次再出吧),顺便记一下WSL开发环境设置(比如安装Anconda、pytorch和Microsoft edge,解决中文乱码问题)。
安装WSL2
Emm,为啥这里不装个单独的虚拟机啥的?因为我懒。。。
首先,打开cmd或者powershell,输入:
1 | wsl --install |
等待下载(可能需要重启),然后把Ubuntu卸了(原生的是Ubuntu 20.04,没有22.04,但是不这样你电脑可能有些设置没开,之前装过的请跳过这步),打开Windows store,安装Ubuntu22.04lts,完成安装步骤(建议选英语,要不然下几步我不确定会不会出问题)。
然后,输入:
1 | sudo apt update |
转移安装位置
因为WSL很大,所以我们需要把它装到D盘,使用如下命令(打开cmd):
1 | wsl --export Ubuntu-22.04 D:/export.tar |
WSL即被挪到D:\Ubuntu
,可以删除镜像文件export.tar
。
GPU支持
可以安装对应平台的驱动获得GPU加速,参见在适用于 Linux 的 Windows 子系统上运行 Linux GUI 应用。
WSL2中文字体问题
由于WSL安装包经常是没有中文的(你选了也会少字体),所以要进行配置(此处参见了wsl2官方gui安装IDEA踩坑记录)。
安装相关包
1 | sudo apt install language-pack-zh-hans |
安装 Windows 字体,编辑/etc/fonts/local.conf
:
1 |
|
刷新字体缓存:
1 | sudo fc-cache -f -v |
重启WSL(记得在cmd或者powershell打这步):
1 | wsl --shutdown |
搞定,但是建议把语言换回英语(命令行真的中文支持不太好),记得再重启WSL:
1 | sudo dpkg-reconfigure locales |
安装依赖
由于Qt自动搜索对于某些包非常不智能,建议严格按照以下安装,不然有可能导致奇奇怪怪的错误:
1 | sudo apt install g++-12 clang-14 gdb cmake ninja-build build-essential libgl1-mesa-dev libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libatspi2.0-dev libclang-14-dev gperf libdouble-conversion-dev libmd4c-dev libmd4c-html0 python3-pip bison flex libhunspell-dev libc++-14-dev libc++abi-14-dev |
安装Qt
对,强烈建议你先装个qt,要不然直接编译极易出问题,建议从Qt官方下载在线安装包。(可以Windows里下了挪进去也可以直接wget
下载)
在线安装包需要赋予权限:
1 | sudo chmod +x qt-unified-linux-x64-xxx--online.run |
运行:
1 | sudo ./qt-unified-linux-x64-xxx--online.run |
建议安装选项选Custom Installation
,选Qt 6.3.1
(或者最新的某个稳定版)下的Desktop gcc 64-bit
、Qt Charts
和source
以及Developer and Designer Tools
下的Qt Design Studio
(不建议再安装Cmake
和Ninja
,它们在之前装过了,可能会导致后面寻路失败),安装。
安装Anaconda和Microsoft Edge
什么,为什么这里会突然冒出来这个?呃,你没发现Qt安装得贼慢吗,我们可以干一些别的事情,比如装个Anaconda、pytorch和Microsoft Edge。
安装Anaconda和pytorch
打开Anaconda官网,下载Linux版Anaconda,然后打开另一个Ubuntu窗口:(强烈建议Qt开发机别装)
1 | sudo bash Anaconda3-xxxxxx-Linux-x86_64.sh |
建议选/usr/local/anaconda3
为安装位置。安装完运行(这步命令与安装位置有关系):
1 | /usr/local/anaconda3/bin/conda init |
重启这个Ubuntu窗口,并输入(为root用户创建conda环境):
1 | sudo su |
去pytorch官网看一下怎么安装,笔者这里安装有cuda11.3的版本(cuda需要额外在Windows里安装),输入:
1 | conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch |
安装Microsoft Edge
有时候,某些开发需要浏览器,为了体验一致性(与Windows),我们可以按微软给的Edge Linux版本说明使用命令行安装(这里是Ubuntu,其余自己去官网看):
1 | # Setup |
cc环境变量设置
这里可能会有小伙伴们发现gcc -v
输出的是11,但我们装的是12,不是吗?这就需要切换环境变量,在AskUbuntu上有一个问答:How
to choose the default gcc and g++
version?,里面提到了我们可以用如下命令切换:(其中10、20、30是优先级,数字越大,优先级越高)
1 | sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 10 |
如果你之前用过update-alternatives
,可以使用如下命令清除:
1 | sudo update-alternatives --remove-all gcc |
安装nodejs
1 | wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash |
Qt编译
时间差不多到了,回来编译Qt,因为大小原因,先编个qtbase
和qtcharts
吧,有需要再搞其他。
打开/opt/Qt/6.x.x/
,新建一个build
文件夹,之后好删中间文件:
1 | cd /opt/Qt/6.x.x/ |
这里可能要先关掉anaconda
环境,输入:
1 | conda deactivate |
同时不要索引anaconda安装的库,使用:
1 | echo $PATH |
输出:
1 | /home/xxx/anaconda3/bin:/usr/xxx/bin:/usr/xxx/local/bin |
去掉anaconda部分:
1 | PATH=/usr/xxx/bin:/usr/xxx/local/bin |
配置编译,输入以下命令:
1 | /opt/Qt/6.3.1/Src/configure -prefix /opt/Qt/6.3.1/gcc_64_static -debug-and-release -static -submodules qtbase,qtcharts,qtwayland -platform linux-g++ -c++std c++20 |
好的,按道理来说会正常输出:
1 | Qt is now configured for building. Just run 'cmake --build . --parallel' |
再输入:
1 | cmake --build . --parallel |
等待编译完成,可能得几个小时,编译完成后输入:
1 | ninja install |
错误与解决方法
不幸,最简单的Widget应用输出了:
1 | /usr/lib/x86_64-linux-gnu/libfontconfig.so: undefined reference to `uuid_parse@UUID_1.0` |
似乎是Anaconda中又有同名库导致的了,卸载Anaconda后有效,也许可以通过设置路径解决,吐了,下次生成一份完整静态版然后直接存档行了吧。