Qt版本
Qt Creator 4.6.2
Desktop Qt 5.11.1 MinGW 32bit
qmake
查阅qmake有关的内容,都可以在Qt官网文档中的qmake Manual查阅。
使用Qt Creator创建项目的话,默认会生成一个可以直接运行的环境,项目文件(.pro)就是一个qmake文件。
HelloWorld.pro
#-------------------------------------------------
#
# Project created by QtCreator 2021-12-04T17:25:05
#
#-------------------------------------------------
# 使用Qt提供的core库和gui库
QT += core gui
# 如果QT主版本号大于4的话,就加上widgets库
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
# 最后生成的目标文件
TARGET = HelloWorld
# 指定模板为app,qmake会生成一个应用程序的Makefile
TEMPLATE = app
# 工程中包含的源文件
SOURCES += main.cpp\
mainwindow.cpp
# 工程中包含的头文件
HEADERS += mainwindow.h
# 工程中包含的UI文件
FORMS += mainwindow.ui
命令行方式编译
通过命令行的方式可以清晰地了解到Qt的代码是如何进行编译的,以下例子在linux的环境下执行。
qmake HelloWorld.pro
执行qmake命令之后,目录会多出两个文件,一个是编译使用的Makefile,一个是uic_wrapper.sh。
uic_wrapper.sh
#!/bin/sh
LD_LIBRARY_PATH=/Qt/x86_qt-everywhere-opensource-src-5.6.2/qtbase/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
export LD_LIBRARY_PATH
QT_PLUGIN_PATH=/Qt/x86_qt-everywhere-opensource-src-5.6.2/qtbase/plugins${QT_PLUGIN_PATH:+:$QT_PLUGIN_PATH}
export QT_PLUGIN_PATH
exec /Qt/x86_qt-everywhere-opensource-src-5.6.2/qtbase/bin/uic "$@"
uic_wrapper.sh将会在Makefile中使用到,它的作用就是用来指定uic工具的环境变量并且使用他。
接下来,执行make命令,看看Makefile具体做了哪些工作。
## 由于编译选项比较多,所以下面编译语句中的一些头文件路径,依赖库路径选项都进行删除
# 将UI文件转换成头文件
uic_wrapper.sh mainwindow.ui -o ui_mainwindow.h
# 编译main.cpp文件
g++ -c -o main.o main.cpp
# 编译mainwindow.cpp文件
g++ -c -o mainwindow.o mainwindow.cpp
# moc将qt扩展的c++语法转换成成标准c++代码,例如代码中存在 Q_OBJECT的话,就需要转换。
moc mainwindow.h -o moc_mainwindow.cpp
# 编译moc_mainwindow.cpp文件
g++ -c -o moc_mainwindow.o moc_mainwindow.cpp
# 最后链接,生成目标文件
g++ -o HelloWorld main.o mainwindow.o moc_mainwindow.o -lQt5Widgets -lQt5Gui -lQt5Core -lpthread
cmake
在qmake无法满足开发需求的时候,也可以使用cmake进行替代。
在Qt的官网文档中的Get started with CMake,已经给出了基础的CMakeLists.txt,可以基于这个进行修改。