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,自由地去组织文件的编译和生成了。

相关推荐
无敌暴龙兽z2 小时前
离线环境安装elk及设置密码认证
运维·elk
M4K02 小时前
Linux百度网盘优化三板斧
linux
好奇的菜鸟3 小时前
如何在 Ubuntu 24.04 (Noble) 上使用阿里源
linux·运维·ubuntu
bcbobo21cn3 小时前
初步了解Linux etc/profile文件
linux·运维·服务器·shell·profile
wayuncn3 小时前
月付物理服务器租用平台-青蛙云
运维·服务器·服务器租用·服务器托管·物理机租用
望获linux3 小时前
【实时Linux实战系列】CPU 隔离与屏蔽技术
java·linux·运维·服务器·操作系统·开源软件·嵌入式软件
0wioiw03 小时前
C#基础(项目结构和编译运行)
linux·运维·服务器
2401_873587825 小时前
Linux常见指令以及权限理解
linux·运维·服务器
RW~5 小时前
Minio安装配置,桶权限设置,nginx代理 https minio
运维·nginx·https·minio
Arthurmoo5 小时前
Linux系统之MySQL数据库基础
linux·数据库·mysql