Qt6静态编译(一):Linux编译

Qt挺好用的,但是静态编译使人头大,这里记录一下Linux上咋静态编译(Windows上下次再出吧),顺便记一下WSL开发环境设置(比如安装Anconda、pytorch和Microsoft edge,解决中文乱码问题)。

安装WSL2

Emm,为啥这里不装个单独的虚拟机啥的?因为我懒。。。

首先,打开cmd或者powershell,输入:

wsl --install

等待下载(可能需要重启),然后把Ubuntu卸了(原生的是Ubuntu 20.04,没有22.04,但是不这样你电脑可能有些设置没开,之前装过的请跳过这步),打开Windows store,安装Ubuntu22.04lts,完成安装步骤(建议选英语,要不然下几步我不确定会不会出问题)。

然后,输入:

sudo apt update
sudo apt upgrade 

转移安装位置

因为WSL很大,所以我们需要把它装到D盘,使用如下命令(打开cmd):

wsl --export Ubuntu-22.04 D:/export.tar 
wsl --import Ubuntu-22.04 D:\Ubuntu\ D:\export.tar --version 2

WSL即被挪到D:\Ubuntu,可以删除镜像文件export.tar

GPU支持

可以安装对应平台的驱动获得GPU加速,参见在适用于 Linux 的 Windows 子系统上运行 Linux GUI 应用

WSL2中文字体问题

由于WSL安装包经常是没有中文的(你选了也会少字体),所以要进行配置(此处参见了wsl2官方gui安装IDEA踩坑记录)。

安装相关包

sudo apt install language-pack-zh-hans
sudo dpkg-reconfigure locales #这一步要选择en_US.UTF-8和zh_CN.UTF-8, 并且zh_CN.UTF-8为默认语言
sudo apt install fontconfig

安装 Windows 字体,编辑/etc/fonts/local.conf:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <dir>/mnt/c/Windows/Fonts</dir>
</fontconfig>

刷新字体缓存:

sudo fc-cache -f -v

重启WSL(记得在cmd或者powershell打这步):

wsl --shutdown

搞定,但是建议把语言换回英语(命令行真的中文支持不太好),记得再重启WSL:

sudo dpkg-reconfigure locales

安装依赖

由于Qt自动搜索对于某些包非常不智能,建议严格按照以下安装,不然有可能导致奇奇怪怪的错误:

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
sudo apt autoremove 

安装Qt

对,强烈建议你先装个qt,要不然直接编译极易出问题,建议从Qt官方下载在线安装包。(可以Windows里下了挪进去也可以直接wget下载)

在线安装包需要赋予权限:

sudo chmod +x qt-unified-linux-x64-xxx--online.run

运行:

sudo ./qt-unified-linux-x64-xxx--online.run

建议安装选项选Custom Installation,选Qt 6.3.1(或者最新的某个稳定版)下的Desktop gcc 64-bitQt Chartssource以及Developer and Designer Tools下的Qt Design Studio(不建议再安装CmakeNinja,它们在之前装过了,可能会导致后面寻路失败),安装。

安装Anaconda和Microsoft Edge

什么,为什么这里会突然冒出来这个?呃,你没发现Qt安装得贼慢吗,我们可以干一些别的事情,比如装个Anaconda、pytorch和Microsoft Edge。

安装Anaconda和pytorch

打开Anaconda官网,下载Linux版Anaconda,然后打开另一个Ubuntu窗口:(强烈建议Qt开发机别装)

sudo bash Anaconda3-xxxxxx-Linux-x86_64.sh

建议选/usr/local/anaconda3为安装位置。安装完运行(这步命令与安装位置有关系):

/usr/local/anaconda3/bin/conda init

重启这个Ubuntu窗口,并输入(为root用户创建conda环境):

sudo su
/usr/local/anaconda3/bin/conda init
exit
sudo su
conda update --all
conda install html5lib

pytorch官网看一下怎么安装,笔者这里安装有cuda11.3的版本(cuda需要额外在Windows里安装),输入:

conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch

安装Microsoft Edge

有时候,某些开发需要浏览器,为了体验一致性(与Windows),我们可以按微软给的Edge Linux版本说明使用命令行安装(这里是Ubuntu\Debian的beta版本,其余自己去官网看):

## Setup
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo install -o root -g root -m 644 microsoft.gpg /usr/share/keyrings/
sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/edge stable main" > /etc/apt/sources.list.d/microsoft-edge-beta.list'
sudo rm microsoft.gpg
## Install
sudo apt update
sudo apt install microsoft-edge-beta

cc环境变量设置

这里可能会有小伙伴们发现gcc -v输出的是11,但我们装的是12,不是吗?这就需要切换环境变量,在AskUbuntu上有一个问答:How to choose the default gcc and g++ version?,里面提到了我们可以用如下命令切换:(其中10、20、30是优先级,数字越大,优先级越高)

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 20

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 20

sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
sudo update-alternatives --set cc /usr/bin/gcc

sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
sudo update-alternatives --set c++ /usr/bin/g++

如果你之前用过update-alternatives,可以使用如下命令清除:

sudo update-alternatives --remove-all gcc 
sudo update-alternatives --remove-all g++

安装nodejs

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
nvm install node

Qt编译

时间差不多到了,回来编译Qt,因为大小原因,先编个qtbaseqtcharts吧,有需要再搞其他。

打开/opt/Qt/6.x.x/,新建一个build文件夹,之后好删中间文件:

cd /opt/Qt/6.x.x/
mkdir build
cd build

这里可能要先关掉anaconda环境,输入:

conda deactivate

同时不要索引anaconda安装的库,使用:

echo $PATH

输出:

/home/xxx/anaconda3/bin:/usr/xxx/bin:/usr/xxx/local/bin

去掉anaconda部分:

PATH=/usr/xxx/bin:/usr/xxx/local/bin

配置编译,输入以下命令:

/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

好的,按道理来说会正常输出:

Qt is now configured for building. Just run 'cmake --build . --parallel'

Once everything is built, you must run 'ninja install'
Qt will be installed into '/opt/Qt/6.x.x/gcc_64_static'

To configure and build other Qt modules, you can use the following convenience script:
        /opt/Qt/6.x.x/gcc_64_static/bin/qt-configure-module

If reconfiguration fails for some reason, try removing 'CMakeCache.txt' from the build directory

-- Configuring done
-- Generating done
-- Build files have been written to: /opt/Qt/6.x.x/build

再输入:

cmake --build . --parallel

等待编译完成,可能得几个小时,编译完成后输入:

ninja install 

错误与解决方法

不幸,最简单的Widget应用输出了:

/usr/lib/x86_64-linux-gnu/libfontconfig.so: undefined reference to `uuid_parse@UUID_1.0`

似乎是Anaconda中又有同名库导致的了,卸载Anaconda后有效,也许可以通过设置路径解决,吐了,下次生成一份完整静态版然后直接存档行了吧。