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

相关推荐
小妖66620 分钟前
linux (centos) 的 nodejs 安装全局包后使用命令无效
linux·运维·centos
不穿格子衬衫44 分钟前
感受命令行界面的魅力——Linux环境下基础开发工具的使用
linux·运维·centos
誓约酱1 小时前
linux 下消息队列
linux·运维·服务器·c语言·c++
獨枭1 小时前
Ubuntu 优化 Vim 指南
linux·ubuntu·vim
阿常呓语1 小时前
Jenkins服务搭建
运维·jenkins
一匹电信狗2 小时前
【Linux我做主】基础命令完全指南下篇
linux·运维·服务器·c++·开源·centos·unix
wanhengidc2 小时前
海外服务器的网络带宽该如何进行选择?
运维·服务器
小安同学iter2 小时前
SpringMVC(七)数据校验+VO++脱敏
java·服务器·spring·java-ee·intellij-idea
翱翔-蓝天3 小时前
CentOS 上扩展 Swap 分区的大小
linux·运维·centos