Linux上位机开发实战(qt编译之谜)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

很多同学都喜欢用IDE,也能理解。因为不管是visual studio qt插件,还是qt creator其实都帮我们做了很多额外的工作。这里面最重要的部分,就是利用uic、moc和rcc命令帮我们生成了额外的h文件、moc cpp文件、qrc cpp文件。换句话说,这些操作对我们来说都是透明的。但只要我们了解清楚了里面的原理,就会发现其实就是那么回事。

1、uic命令

我们都知道,qt的图形界面就是ui文件。ui文件一般用qt designer生成。那么ui文件怎么和具体的class绑定在一起呢?方法就在uic工具,一般用uic可以直接生成h头文件,类似于这样,

复制代码
uic QtWidgetsApplication.ui -o ui_QtWidgetsApplication.h

有了这个ui_QtWidgetsApplication.h头文件之后,我们就可以在QtWidgetsApplication.h里面自由使用ui对象里面的控件了,

复制代码
#include <QtWidgets/QMainWindow>
#include "ui_QtWidgetsApplication.h"

class QtWidgetsApplication : public QMainWindow
{
    Q_OBJECT

public:
    QtWidgetsApplication(QWidget *parent = nullptr);
    ~QtWidgetsApplication();

private:
    Ui::QtWidgetsApplicationClass ui;
};

2、moc命令

刚才分析QtWidgetsApplication类的时候,不知道大家有没有注意,这里面还包含了一个Q_OBJECT宏。通过这个宏以及moc命令,qt就可以帮我们生成额外的cpp代码。例如,我们使用qt的时候很方便,直接把控件和slot槽函数做一个connect就可以了。但是具体怎么调用的,其实是moc自动生成的cpp文件来完成的,

复制代码
INCLUDE_DIR=-I /usr/include/aarch64-linux-gnu/qt5 \
            -I /usr/include/aarch64-linux-gnu/qt5/QtWidgets\
            -I /usr/include/aarch64-linux-gnu/qt5/QtGui \
            -I /usr/include/aarch64-linux-gnu/qt5/QtCore

moc_QtWidgetsApplication.o : moc_QtWidgetsApplication.cpp
	g++ -g -c moc_QtWidgetsApplication.cpp -o moc_QtWidgetsApplication.o $(INCLUDE_DIR)

moc_QtWidgetsApplication.cpp : QtWidgetsApplication.h
	moc -o moc_QtWidgetsApplication.cpp QtWidgetsApplication.h

生成的moc_QtWidgetsApplication.cpp最终也要链接到可执行文件里面去的。

3、rcc命令

除了上面说的ui文件、Q_OBJECT宏处理,还有一种qrc文件也需要进行处理。这种qrc文件,类似于原来windows系统里面的rc资源文件。qt一般是通过rcc命令,把它变成cpp文件来处理。这样就可以同样链接到最终可执行文件中去了。

复制代码
INCLUDE_DIR=-I /usr/include/aarch64-linux-gnu/qt5 \
            -I /usr/include/aarch64-linux-gnu/qt5/QtWidgets\
            -I /usr/include/aarch64-linux-gnu/qt5/QtGui \
            -I /usr/include/aarch64-linux-gnu/qt5/QtCore

obj/qrc_QtWidgetsApplication.o: qrc_QtWidgetsApplication.cpp
	g++ -c -g qrc_QtWidgetsApplication.cpp -o obj/qrc_QtWidgetsApplication.o $(INCLUDE_DIR)

qrc_QtWidgetsApplication.cpp:
	rcc  QtWidgetsApplication.qrc -o qrc_QtWidgetsApplication.cpp

4、总结

qt程序的编译,其实没有脱离常见的编译法则,比如编译、链接、静态库、动态库、可执行文件。只是很多操作都被隐藏掉了,比如这里说的uic、moc、rcc命令。我们常用的visual studio qt插件,或者是qt creator,都默认帮我们做了这些工作,这才导致我们并不是很清楚qt的编译原理。等到明白过来之后,其实就可以自由地编写Makefile,自由地去组织文件的编译和生成了。

相关推荐
chlk12317 小时前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑18 小时前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件18 小时前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
碳基沙盒19 小时前
OpenClaw 多 Agent 配置实战指南
运维
深紫色的三北六号1 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash1 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI2 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行2 天前
Linux和window共享文件夹
linux
Sinclair3 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
木心月转码ing3 天前
WSL+Cpp开发环境配置
linux