因为要使用一个 C++ 库,但是又不想在终端环境下直接操作,便想要借助 Qt 这个工具,但是实际使用的时候却出现了一些错误,查证之后是某些头文件和库文件没有添加,虽然问题最终都解决了,但是还是把这过程中看到的资料写一下,防止忘记。
Qt 为我们提供了一个用于管理项目构建的工具,该工具就是 qmake。利用该工具可以控制所使用到的各种源文件,还可以将每个项目文件中的信息扩展为 Makefile,并执行编译和链接。
如果是使用 Qt creator 的新建项目向导建立的模板项目,并且过程中没有使用到任何第三方的东西,那么在敲完代码之后,直接编译运行就搞定了。但是如果使用到了某些第三方工具或是要对项目模板做出某些更改,就需要对项目文件(.pro)进行操作了。
其实上边说的这些可能一时之间不是太能理解,但是实际编过代码,看过pro文件内容之后就差不多理解了。
其实项目文件主要是为 qmake 铺桥搭路的,其实有点类似于 cmake 中的 CMakeLists.txt 文件。如果知道 cmake 的话,可以将两者对比着来看。qmake 中的项目文件中存在不同的元素。
值列表的变量赋值为:
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
.pro 文件之前已经简单说过了,其实只要知道这个文件是什么,里边的结构是什么样子的。在具体构建项目的时候对应参数进行设置就可以了。如果要记忆的话,里边的参数真的是有点多。
其实除了 .pro 文件之外,还能把该文件中的某一部分单独拿出来,从而形成了其它的 *.pr* 文件。
也就是说我们的 .pro 文件中会有这么一句话:
include(priname.pri)
也就是说我们的 .pro 文件中会有这么一句话:
CONFIG += prfname
或是:
load(prfname)
如果要生成静态库,就需要配置:
CONFIG += create_prl
之后就会生成和库同名的 .prl 文件。