Ubuntu下Qt5静态编译,告别依赖烦恼
Ubuntu下Qt5静态编译,告别依赖烦恼
在Linux环境下进行软件开发时,依赖问题常常让人头疼。特别是在Qt这样的大型框架中,动态链接库的依赖关系复杂,容易导致程序在不同环境下的运行不稳定。为了解决这一问题,静态编译成为了一个重要的选择。本文将详细介绍如何在Ubuntu下进行Qt5的静态编译,帮助开发者告别依赖烦恼。
为什么选择静态编译?
静态编译是将所有依赖的库文件在编译时就链接到可执行文件中,生成一个独立的、不依赖外部库的可执行文件。相比动态链接,静态编译有以下优势:
解决依赖问题:静态编译生成的可执行文件包含了所有需要的库函数,不再依赖于系统中是否安装了这些库,避免了“找不到库”的困扰。
提升可移植性:由于不依赖外部库,编译好的程序可以在不同版本的Linux系统中直接运行,大大提升了软件的可移植性。
安全性:静态编译的程序不容易受到系统中其他库版本的影响,避免了因库版本不兼容导致的安全问题。
性能优化:虽然静态编译的可执行文件体积较大,但在某些情况下,由于减少了动态链接的开销,程序运行速度可能会更快。
环境准备
1. 开启root账户自动登录
为了简化权限管理,建议使用root账户进行编译。以下是开启root账户自动登录的步骤:
- 创建root用户密码:
sudo passwd root
- 修改
50-ubuntu.conf
文件:
sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf
在文件末尾添加:
greeter-show-manual-login=true
all-guest=false
- 修改
gdm-autologin
文件:
sudo gedit /etc/pam.d/gdm-autologin
注释掉第三行的auth required pam_succeed_if.so user != root quiet_success
- 修改
gdm-password
文件:
sudo gedit /etc/pam.d/gdm-password
同样注释掉第三行的auth required pam_succeed_if.so user != root quiet_success
- 修改
/root/.profile
文件:
sudo gedit /root/.profile
将最后一行的mesg n 2> /dev/null || true
修改为:
tty -s && mesg n || true
- 修改
custom.conf
文件:
sudo gedit /etc/gdm3/custom.conf
在[daemon]
下添加:
AutomaticLoginEnable=true
AutomaticLogin=root
TimedLoginEnable = true
TimedLogin = root
TimedLoginDelay = 10
重启后,系统将自动登录到root账户。
2. 安装Qt Creator
建议通过在线安装包安装Qt Creator,这样可以自动处理openssl等依赖:
wget https://download.qt.io/archive/online_installers/4.5/qt-unified-linux-x64-4.5.1-online.run
chmod -R 777 qt-unified-linux-x64-4.5.1-online.run
./qt-unified-linux-x64-4.5.1-online.run
在安装过程中,选择定制安装,仅选择Qt Creator和必要的组件,建议选择openssl支持。
3. 安装编译依赖
确保系统已经安装了必要的编译工具和库:
sudo apt-get install build-essential
sudo apt-get install bison build-essential gperf flex ruby libasound2-dev libbz2-dev libcap-dev libcups2-dev libdrm-dev libegl1-mesa-dev libnss3-dev libpci-dev libpulse-dev libudev-dev libxtst-dev gyp ninja-build libglu1-mesa-dev libfontconfig1-dev libx11-xcb-dev libicu-dev libxkbcommon-x11-dev python3 libxcb-xfixes0-dev libqt5serialport5 libqt5serialport5-dev libgl1-mesa-dev freeglut3-dev aptitude
如果项目需要openssl支持,还需要安装openssl 1.1.1版本:
sudo apt-get remove openssl
sudo wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz
sudo tar -zxvf openssl-1.1.1d.tar.gz
cd openssl-1.1.1d/
./config
make
sudo make install
下载和编译Qt5源码
从Qt官网下载Qt5的源码包,例如
qt-everywhere-src-5.15.2.tar.xz
解压源码包到指定目录:
tar -xvf qt-everywhere-src-5.15.2.tar.xz
cd qt-everywhere-src-5.15.2
- 配置编译选项:
./configure -static -prefix /opt/qt5-static -release -opensource -confirm-license -nomake examples -nomake tests
这里的关键选项是-static
,表示进行静态编译。-prefix
指定了安装目录,可以根据需要修改。
- 编译和安装:
make
sudo make install
编译过程可能需要较长时间,请耐心等待。
常见问题及解决方案
- 无法解析的外部符号
错误信息:
Qt6Core.lib(qsemaphore.cpp.obj) : error LNK2001: 无法解析的外部符号 _Cnd_timedwait_for_unchecked
Qt6Core.lib(qreadwritelock.cpp.obj) : error LNK2001: 无法解析的外部符号 _Cnd_timedwait_for_unchecked
Qt6Gui.lib(qkeysequence.cpp.obj) : error LNK2019: 无法解析的外部符号 __std_mismatch_4
解决方案:这可能是由于MSVC编译器的bug导致。尝试更新到最新版本的MSVC(例如17.12.3),通常可以解决此类问题。
- 缺少UIAutomationCore.lib
错误信息:
ninja:-1: error: 'D:/Windows Kits/10/Lib/10.0.22621.0/um/x64/UIAutomationCore.lib', needed by 'QT_static_1.exe', missing and no known rule to make it
解决方案:重新编译Qt源码,避免使用本地预编译的库。确保所有依赖都从源码编译得到。
总结
通过静态编译,我们可以有效解决Qt应用程序的依赖问题,提升软件的可移植性和安全性。虽然静态编译的过程相对复杂,需要处理较多的依赖和配置,但一旦编译成功,就能获得一个独立运行的可执行文件,大大简化了软件的部署和维护工作。对于需要在多个环境中运行的Qt应用程序来说,静态编译是一个值得掌握的重要技能。