因为要使用一个 C++ 库,但是又不想在终端环境下直接操作,便想要借助 Qt 这个工具,但是实际使用的时候却出现了一些错误,查证之后是某些头文件和库文件没有添加,虽然问题最终都解决了,但是还是把这过程中看到的资料写一下,防止忘记。
qmake
Qt 为我们提供了一个用于管理项目构建的工具,该工具就是 qmake。利用该工具可以控制所使用到的各种源文件,还可以将每个项目文件中的信息扩展为 Makefile,并执行编译和链接。
如果是使用 Qt creator 的新建项目向导建立的模板项目,并且过程中没有使用到任何第三方的东西,那么在敲完代码之后,直接编译运行就搞定了。但是如果使用到了某些第三方工具或是要对项目模板做出某些更改,就需要对项目文件(.pro)进行操作了。
什么是项目文件
- 项目文件就是 Qt 项目中的那个以 .pro 结尾的文件
- 项目文件通常包含源文件、头文件、常规配置信息以及特定应用程序的详细信息的列表
- 项目文件可以包含许多不同的元素,包括注释、变量声明、内置函数和一些简单的控制结构
- 利用项目文件也可以为复杂项目创建更复杂的项目文件
其实上边说的这些可能一时之间不是太能理解,但是实际编过代码,看过pro文件内容之后就差不多理解了。
项目文件中的元素
其实项目文件主要是为 qmake 铺桥搭路的,其实有点类似于 cmake 中的 CMakeLists.txt 文件。如果知道 cmake 的话,可以将两者对比着来看。qmake 中的项目文件中存在不同的元素。
变量
- 在项目文件中,变量用于保存字符串列表。
- qmake 查找所有的项目文件变量,并使用这些变量内容来确定写入 Makefile 文件的内容。
- 变量也可以在内部使用,用来存储临时值列表,并且现有值列表可以用新值覆盖或扩展。
值列表的变量赋值为:
HEADERS = mainwindow.h paintwidget.h
常见的变量及其描述为:
变量名 | 描述 |
CONFIG | 生成项目配置选项 |
DESTDIR | 可执行文件或二进制文件的存放位置 |
FORMS | 用户界面编译器(uic)要处理的UI文件列表 |
HEADERS | 建立项目时使用的头文件(.h)列表 |
QT | 项目中使用的Qt模块列表 |
RESOURCES | 包含在最终项目的资源文件(.qrc)列表 |
SOURCES | 建立项目时使用的源文件列表 |
TEMPLATE | 项目使用的模板。该变量决定构建输出结果是应用程序、库或是插件 |
变量的内容可以通过前加 “$$” 来读取。这可用于将一个变量的内容赋值给另一个:
TEMP_SOURCES = $$SOURCES
空格
通常情况下,对变量进行赋值时,用空格来分割值。如果指定值中包含空格,就需要使用双引号:
DEST = "Program Files"
该形式一般用来处理包含空格的路径,尤其是 windows 平台下的 INCLUDEPATH 和 LIBS 变量。
win32:INCLUDEPATH += "C:/mylibs/extra headers"
unix:INCLUDEPATH += "/home/user/extra headers"
注释
在项目文件中可以添加注释,注释以“#”开头直到该行末尾。例如:
# Comments usually start at the beginning of a line, but they
# can also follow other content on the same line.
如果变量赋值中包含字符#,就需要使用内建变量 LITERAL_HASH。
内置函数
qmake 提供了许多内置nei函数来启用要使用的变量内容。如函数 include() 以文件名为参数,使给定文件的内容包含在使用函数 include() 的项目文件中:
include(other.pro)
内置函数还有很多,分别有不同的作用,具体的可以查看官方手册。
控制流
控制流有点类似与编程语言中的分支结构,可以实现不同条件下的控制。而项目文件中是以作用域实现的:
win32 {
SOURCES += paintwidget_win.cpp
}
上述代码仅当条件为真时,才进行大括号内的赋值。也就是当 win32 存在才执行大括号中的语句。要注意的是左大括号必须与条件同行。
几个简单实例
利用 CONFIG 变量指定项目配置的选项和功能:
CONFIG += qt release
利用 QT 声明所需的扩展模块:
QT += network xml
配置功能
可以使用功能(.prf)文件中指定的其他配置功能来设置 qmake。这些额外的功能通常为在构建过程中使用的自定义工具提供支持。要将功能添加到构建过程中,需要将功能名称(功能文件名的词干)附加到CONFIG变量中。如利用pkg-config支持的外部库 bus 和 ogg:
CONFIG += link_pkgconfig
PKGCONFIG += ogg dbus-1
利用 LIBS 和 INCLUDEPATH 指定第三方库
LIBS += -L/usr/local/lib -lmath
INCLUDEPATH = c:/msdev/include d:/stl/include
其它的 *.pr* 文件
.pro 文件之前已经简单说过了,其实只要知道这个文件是什么,里边的结构是什么样子的。在具体构建项目的时候对应参数进行设置就可以了。如果要记忆的话,里边的参数真的是有点多。
其实除了 .pro 文件之外,还能把该文件中的某一部分单独拿出来,从而形成了其它的 *.pr* 文件。
.pri
- i 是 include 的首字母。
- 对于简单项目,可能只需要一个 .pro 文件就够了,因为总共也没有多少东西。
- 但是对于大项目来说,要进行很多设置,此时我们可以把其中的一部分拿出来,单独成为一个文件
- 然后用之前提到的内置函数 include() 包含
也就是说我们的 .pro 文件中会有这么一句话:
include(priname.pri)
.prf
- 我们在简单实例中提到过 “配置功能”,其中功能对应的单词是 feature,而 .prf 中的 f 正是 feature 的首字母
- 该文件也是需要包含进 .pro 文件的
- 一般情况下,利用 CONFIG 变量配置的就是 .prf
- 每次利用 CONFIG 变量添加配置的时候,都会从固定目录加载对应的 .prf 文件
- features 文件名必须小写
- features 所在的目录为 $$QTDIR/mkspecs/features
- 然后用 CONFIG 变量或是内置函数 load 加载
也就是说我们的 .pro 文件中会有这么一句话:
CONFIG += prfname
或是:
load(prfname)
.prl
- .prl 中的 l 表示的是 link 的首字母
- 也就是说,.prl 主要和库的生成和使用有关
如果要生成静态库,就需要配置:
CONFIG += create_prl
之后就会生成和库同名的 .prl 文件。