Qt编译安装
Qt编译环境搭建
- 简便方法:安装编译依赖: sudo apt-get install libpcre2-dev libdouble-conversion-dev libmysql-ocaml-dev libxkbcommon-x11-dev libsqlite3-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-render-util0-dev libxcb-xinerama0-dev libxinerama-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-render-util0-dev libxcb-xinerama0-dev libxinerama-dev libssl-dev libjpeg-dev firebird-dev libdbus-1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libharfbuzz-dev libpng-dev unixodbc-dev libpq-dev freetds-dev flite1-dev libspeechd-dev libudev-dev libzstd-dev libx11-xcb-dev libglu1-mesa-dev "^libxcb.*" build-essential
2.官方权威介绍:https://wiki.qt.io/Building\_Qt\_5\_from\_Git
Qt6.0以前版本编译流程
- 1. 获取Qt源码http://download.qt.io/archive/qt/ ,选择signal 文件夹下名字带有everywhere的源码包下载 并解压。
2. 进入源码目录执行configure 配置,在config之前,请安装对应的依赖包和赋予权限
configure not found 原因:权限不足。解决方法:在源码目录运行 sudo chmod -R 777 ./
- 注意:参数opengl es2 显卡支持opengl 参数opengl 否则选择 opengl es2
- configure配置说明 https://wikidev.uniontech.com/Qt%E7%BC%96%E8%AF%91configure%E8%AF%B4%E6%98%8E
- 可以解决大部分问题 (注意:安装了库之后需要在configure 参数后面加上 -recheck-all 来丢弃缓存配置)
执行之前configure ,请修改命令中--prefix 选项为您需要安装的目录 命令如下:
KLU 平台(这个如果使能-opengl es2还需要安装libgles2-mesa-dev这个包)
./configure -confirm-license --prefix="/opt/usr" -opensource -plugin-sql-mysql -plugin-sql-sqlite -no-sql-sqlite2 -plugin-sql-tds -system-sqlite -system-harfbuzz -system-zlib -system-libpng -system-libjpeg -system-doubleconversion -system-pcre -openssl -no-rpath -verbose -optimized-qmake -dbus-linked -no-strip -no-separate-debug-info -qpa wayland -xcb -glib -icu -accessibility -nomake examples -nomake tests -no-directfb -no-use-gold-linker -debug -opengl es2 -recheck-all
X86平台
./configure -confirm-license --prefix="/opt/usr" -opensource -plugin-sql-mysql -plugin-sql-sqlite -no-sql-sqlite2 -plugin-sql-tds -system-sqlite -system-harfbuzz -system-zlib -system-libpng -system-libjpeg -system-doubleconversion -system-pcre -openssl -no-rpath -verbose -optimized-qmake -dbus-linked -no-strip -no-separate-debug-info -qpa xcb -xcb -glib -icu -accessibility -nomake examples -nomake tests -no-directfb -no-use-gold-linker -debug -opengl desktop -recheck-all
注意:在make前请务必确保安装目录不是usr 否则可能导致系统崩溃 !
make -j8 开始编译,-j表示编译的线程数,请根据自己的电脑设置 ,该过程大概0.5~1小时根据机器配置决定。没有出错表示正常编译
make install
编译完成之后,在编译我们的应用或者DTK的时候,可能会出现一些问题。
not found modules KCodecs 、gio-qt 、polkit-qt5-gui 原因:该模块不在Qt源码中。解决方法:在pro中手动指定 目录和 链接库
error: aggregate ‘QPainterPath path’ has incomplete type and cannot be defined QPainterPath path; 原因:15版本需要手动添加 解决方法:添加都文件 #include
error: aggregate QMouse**** has incomplete type and cannot be defined QMouse**** path; 同上
QGStrings 找不到。解决方法:需要将系统 /usr/include/x86_64-linux-gnu/qt/QGSetting 拷贝到安装目录的Include下面
Qt6.0之后版本编译流程
由于很多小伙伴需要向Qt上游贡献源码,所以我们需要拉取Qt dev分支的代码进行编译验证。目前Qt 官方dev分支已经全部从pro工程替换为cmake工程,所以现在编译dev分支的代码需要按照如下的方式进行编译。
更新cmake版本,推荐使用cmake版本为3.19的版本(亲测CMake 3.20的版本编译失败),可以直接cmake官网下载源码然后解压,编译安装命令为: ./configure make -j8 make install
进入到qtbase目录,然后执行如下配置指令: ./configure -confirm-license --prefix=edit_build -opensource -openssl -no-rpath -optimized-qmake -dbus-linked -no-strip -qpa xcb -xcb -glib -icu -accessibility -no-directfb -no-use-gold-linker -opengl desktop -debug -nomake examples -nomake tests -developer-build ,需要注意的是当前配置指令指定模式为 debug 且安装目录是当前qtbase目录下的 edit_build 目录中。
配置完成后需要执行如下命令进行编译和安装: cmake --build . && cmake --install . ,注意build和install后面有一个 . 符号,以后修改了源码都需要重新执行这两条命令。
当需要编译其他项目,例如qtwayland 时候。调用安装(或者编译)目录下 qt-cmake . 然后再 make 即可
错误解决:
上述步骤中第三步配置时出现错误,一般情况下都是因为cmake版本过低导致,建议升级cmake版本。
编译代码时出现错误,一般情况可能是由于本机环境被破坏导致,建议搭建一个新的净室环境进行重新编译即可。在净室环境中,使用管理员权限打开净室文件夹,然后通过此文件夹打开需要调试的工程即可,需要注意的是修改源码后仍然需要在净室环境中编译Qt源码。
遇到问题必读
为了少踩编译中或编译后的坑,请注意以下事项
编译Qt、DTK 的生产目录,一定不要设置在 /usr 目录,这样非常容易桌面系统崩溃
在编译其他应用时。请设置以下环境变量来 确保程序加载的库 不是系统自带的库
export LD_LIBRARY_PATH=qtbuilddir/lib:dtkbuilddir/lib 说明: 设置程序运行是链接库的路径
export QT_QPA_PLATFORM_PLUGIN_PATH=qtbuilddir/plugins/platforms 说明: 平台相关插件
export QT_PLUGIN_PATH=qtbuilddir/plugins 说明: Qt插件
export PKG_CONFIG_PATH=qtbuilddir/lib/pkgconfig:dtkbuilddir/lib/pkgconfig说明:我们在Qt pro 中配置的 phgconfig 就是用过查找该目录下的.PC文件 实现头文件和库的引入
设置上述环境变量的方式有多种。各有优点,如下: 我们建议通过终端的方式设置环境变量,然后在该终端上启动Qt,不会影响系统。
生效时间:下次打开终端 有效期:永久 生效范围:仅对当前用户有效
缺点:可能导致系统崩溃
生效时间:立即生效 有效期:该项目 生效范围:该项目
优点:随时修改
缺点:项目多的时候每个项目都要设置一遍
生效时间:立即生效 有效期:仅仅在该终端生效,关闭终端无效 生效范围:仅对当前用户有效
优点:不影响系统。
缺点:需要从该终端启动 qtcreator 修改变量需要关闭qtcreator
通过脚本的方式在终端设置环境变量。
在Qt 项目的构建环境中设置
通过修改用户目录下的
~/.bashrc
文件进行配置修改系统配置,需要管理员权限(如root) 不建议!
在情况出乎您的意料的时候,请检查加载的库路径是否正确,检查方法如下
QtCreator 调试模式下菜单栏 控件 -> 视图 -> DebugLoger 该对话框输出了加载库的详细信息
使用ldd + 程序名(库名) 可以看到依赖库
到2021年2月20日止,Qt官方dev分支Qt版本已经更新到6.2,在Qt版本6.0之前,需要使用pro工程进行构建,但是在6.0版本之后,需要使用cmake进行编译。
Qt调试方式
调试分为两种,一种是调试系统中的Qt库,一种是单纯的加载Qt库进行调试。一般情况下我们采用第二种方式,单纯的加载Qt库进行调试,这样的好处可以减少其他库对分析的影响以及可以方便的修改源码进行分析。
一、先说系统库的调试(不建议,会出现源码进去不,单步调试进不去,代码错位以及其他库干扰等杂七杂八的问题)。
1.首先我们需要获取源码,使用以下命令 # apt source qtbase-opensource-src 获取完成会自动应用patch。
2.安装系统库的调试库,例如我需要调试 gui 那么我就安装gui的调试库 # apt install libqt5gui5-dbgsym ,其余同理(安装gui的调试库,只有在GUI部分的源码才能调试进去,如果需要调试整个Qt,建议把qtbase编译出来的调试库都安装上,shuttle上可以找到所有的名称)。
3.把源码路径添加到qtcreator中 ,打开qtcreator。找到 工具->选项->调试器->概要 在源码路径映射这里添加刚才下载的源码。
需要注意的是,源路径需要修改为 . 这样调试的时候才能正确的找到源码的位置。
4.开始调试
二、单纯的加载Qt库进行调试,强烈推荐
1.老规矩 首先我们需要获取源码,使用以下命令 # apt source qtbase-opensource-src
2.编译 这一步参考本文章后面的编译流程
3.当执行完make install 之后我们就可以使用编译出来的Qt了。
4.打开终端设置环境变量 qtbuilddir 是你时设置的安装目录(如果只是make 没有install。就选择源码目录),替换即可
export LD_LIBRARY_PATH=qtbuilddir/lib
export QT_QPA_PLATFORM_PLUGIN_PATH=qtbuilddir/plugins/platforms
export QT_PLUGIN_PATH=qtbuilddir/plugins
export PKG_CONFIG_PATH=qtbuilddir/lib/pkgconfig
5.在终端里面运行qtcreaor。这时候加载的基本就是纯粹的qt了(某些功能还是会加载dtkgui,例如调色板,不过这基本不会影响调试)。
6.添加构建套件。刚才我们在编译qt的时候。qt会自动生产qmake并安装。下面的所有编译调试,我们都是用这个qmake来进行。而不是desktop的构建套件, 构建套件选择错误会出现原来加载不出来的问题。
在Qt Versions 中点击添加按钮,选择刚才安装目录下 bin/qmake (如果只是make 没有install。就选择源码目录下 bin/qmake)。然后点击Apply
然后在构建套件中点击添加按钮,名字随便取,Qt版本选择刚才我们添加的 Qt Versions 然后点击OK
7.下面就可以打开你的工程,在configure project 的时候,一定要选择刚才添加的构建套件,把默认的桌面取消掉
8.开始调试
9.为了阅读源码方便,建议把Qt工程也加进去,但是 在 configure project 的时候一定要注意,把桌面取消掉,使用源码自带的构建套件。不然打开工程会配置失败,看不到源码。
10.下面开始愉快的调试吧
DTK编译安装
获取dtk源码 apt source dtkwidget dtkgui dtkcore
安装编译环境 sudo apt build-dep dtkcore dtkwidget dtkgui && sudo apt install librsvg2-dev && sudo apt install libstartup-notification0-dev
在 工具-选项-Kits-QtVsersions 里面添加对于的Qt版本 并在构建套件里面选择该版本的Qt
- QtVsersions 设置
编译顺序为core、gui、widget 每编译一个安装一个 (直接安装会覆盖系统的dtk ! )
如需指定编译路径,设置 dtkcore 目录下dtk_build_config.prf 中的 PREFIX 变量 修改了DTK库路径之后,请在LD_LIBRARY_PATH 中添加该路径。
可能遇到的问题
找不到 multimedia 相关 原因:可能源码没有编译qtmultimedia 解决方法:进入源码 multimedia 目录 make install
lrelease since it links to lrelease itself。 解决方法 :拷贝链接文件链接的lrelease 到出错目录
找不到QMouse相关的定义 解决方法:在出错文件加上相关头文件
Linux 动态库选择顺序
gcc 编译程序时查找SO顺序
gcc 编译时参数-L指定的路径
环境变量 LIBRARY_PATH LD_LIBRARY_PATH
系统默认库位置 /lib /usr/lib
Linux 程序运行时查找SO顺序
gcc 编译时指定的运行时库路径 -Wl,-rpath
环境变量 LD_LIBRARY_PATH
ldconfig 缓存 /etc/ld.so.cache
系统默认库位置 /lib /usr/lib
包含目录顺序
-I 指定的路径
/usr/include
/usr/local/include
如果需要指定多个路径,请使用英文的:隔开
升级Qt 15.5后编译应用可能会出现的一些问题
KCodecs 模块找不到 拷贝 cp /usr/lib/x86_64-linux-gun/qt5/mkspecs/modules/qt_KCodecs.pri qtbuilddir/mkspecs/modules/qt_KCodecs.pri
KWaylandClient 模块找不到 拷贝 cp /usr/lib/x86_64-linux-gun/qt5/mkspecs/modules/qt_KWaylandClient.pri qtbuilddir/mkspecs/modules/qt_KWaylandClient.pri
QPainterPath 未定义 在该文件中加入 #include
QMouseXXX未定义 在该文件中加入 #include