接前面qmake
乱乱乱谈(一),继续看看qmake。
暂定主题:qmake之命令行参数及qmake启动时加载了什么东西,或许可以借此学习一下qmake是处理命令行参数的方法
命令行参数
运行 qmake -h 可以得到qmake大部分命令行参数及其说明。本文预计涉及到的参数如下:
-project
|
工作于何种模式,project用来生成pro文件。默认是makefile模式
|
-makefile
|
-spec spec
-platform spec
|
使用何种spec? 本文重点
|
-norecursive
-nr
|
是否递归处理.pro文件,
对于subdirs的层层嵌套的Qt工程来说
很常用
|
-recursive
-r
|
-t templ
|
指定工程类型,app、lib还是其他,-tp添加前缀,
比如:“-tp vc”,对于app工程来说,就是vcapp
|
-tp prefix
|
-set <prop> <value>
|
设置、清除、查询属性值,属于上一篇的重点内容
|
-unset <prop>
|
-query
|
-cache file
|
控制cache文件的使用
|
-nocache
|
运行qmake
qmake -spec linux-g++-32 test.pro
按理说:要生成makefile
- 总要有个工程文件吧?
- 总要指定所用的平台和编译器等环境吧?
那么,-speclinux-g++-32究竟有什么用呢?实际上,是通知qmake去加载一个文件:
$QTDIR/mkspecs/linux-g++-32/qmake.conf
不妨看一眼其内容(从这儿你可以看出,CONFIG中默认启用qt,以及Qt默认有core和gui两个模块):
#
# qmake configuration for linux-g++
#
MAKEFILE_GENERATOR = UNIX
TARGET_PLATFORM = unix
TEMPLATE = app
CONFIG += qt warn_on release incremental link_prl gdb_dwarf_index
QT += core gui
QMAKE_INCREMENTAL_STYLE = sublib
QMAKE_CFLAGS = -m32
QMAKE_LFLAGS = -m32
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
load(qt_config)
可是,事实上,运行qmake时,我们很多时候,只需要
qmake
原因何在?
省略 xxx.pro
一旦命令行参数中没有指定 .pro文件,那么qmake采取的策略还是很简单的:
- 如果有和目录同名的 .pro 文件,则使用
- 反之,如果目录中只有一个 .pro结尾的文件,则使用
- 反之,出错。
源码:
static QString detectProjectFile(const QString &path)
{
QString ret;
QDir dir(path);
if(dir.exists(dir.dirName() + Option::pro_ext)) {
ret = dir.filePath(dir.dirName()) + Option::pro_ext;
} else { //last try..
QStringList profiles = dir.entryList(QStringList("*" + Option::pro_ext));
if(profiles.count() == 1)
ret = dir.filePath(profiles.at(0));
}
return ret;
}
如何确定mkspec
qmake 如何确定 mkspec 呢?
啰嗦一点,下面的内容或许可作为以后讨论其他内容的基础。
可以设置环境变量 QMAKEFLAGS ,该变量的值将直接作为qmake的参数使用
如果qmake的参数与QMAKEFLAGS指定的冲突,qmake的命令行参数起作用。
如果 QMAKEFLAGS 和命令行参数中都没有指定 mkspec,那么将尝试查找环境变量 QMAKESPEC
你可能见过 .qmake.cache 这种文件...
如果 QMAKESPEC 也是空的,那么将判断cache中是否设置了 mkspec。
这个过程相当复杂,即使我们确定了mkspec,还有很多工作要做。
查找mkspec
假定我们已经知道了使用了mkspec是 linux-g++-32
qmake 何处去查找相应的mkspec文件(比如我们一开始列出的qmake.conf)??
QStringList qmake_mkspec_paths()
{
QStringList ret;
const QString concat = QDir::separator() + QString("mkspecs");
QByteArray qmakepath = qgetenv("QMAKEPATH");
if (!qmakepath.isEmpty()) {
const QStringList lst = splitPathList(QString::fromLocal8Bit(qmakepath));
for(QStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it)
ret << ((*it) + concat);
}
ret << QLibraryInfo::location(QLibraryInfo::DataPath) + concat;
return ret;
}
环境变量QMAKEPATH以及配置参数QLibraryInfo::DataPath指定目录下的“mkspecs”子目录!
如果我们此时没有设置尚未设置 mkspec,它会去查找前面这些目录中有没有default的子目录,有则作为mkspec文件的目录!比如,在我的系统的QTDIR/mkspecs目录下,有一个default的链接
...
drwxr-xr-x 2 debao debao 4096 2011-06-22 23:41 cygwin-g++
drwxr-xr-x 2 debao debao 4096 2011-06-22 23:41 darwin-g++
lrwxrwxrwx 1 debao debao 9 2011-08-27 17:07 default -> linux-g++
drwxr-xr-x 6 debao debao 4096 2011-08-27 15:29 features
...
.qmake.cache
cache 文件的定位:
看个目录结构(shadow build的经典结构):
|----test\
| `---- test.pro
|
|----test-build\
|
`--- .qmake.cache
两个文件的内容如下:
message($$CONFIG)
CONFIG += dbzhang800
运行qmake../test/test.pro,结果大致如下:
Project MESSAGE: lex yacc warn_on debug uic resources qt warn_on release incremental link_prl gdb_dwarf_index def_files_disabled exceptions no_mocdepend debug stl qt_no_framework dbzhang800 release
可以看出,cache文件在起作用。
注意:如果 当前目录中没有 .qmake.cache,则会往上级目录查找,直到根目录!!例如(查找顺序):
/home/debao/qmake-test/test-build/.qmake.cache
/home/debao/qmake-test/.qmake.cache
/home/debao/.qmake.cache
/home/.qmake.cache
/.qmake.cache
feature文件
qmake运行时还要加载大量的 .prf 文件。
feature文件目录的确定(来自源码中的注释)
1) environment variable QMAKEFEATURES (as separated by colons)
2) property variable QMAKEFEATURES (as separated by colons)
3) <project_root> (where .qmake.cache lives) + FEATURES_DIR
4) environment variable QMAKEPATH (as separated by colons) + /mkspecs/FEATURES_DIR
5) your QMAKESPEC/features dir
6) your data_install/mkspecs/FEATURES_DIR
7) your QMAKESPEC/../FEATURES_DIR dir
FEATURES_DIR is defined as:
1) features/(unix|win32|macx)/
2) features/
feature文件的加载:
- 加载 default_pre.prf
- 处理工程文件.pro
- CONFIG+=... 后面跟的每一个东西,qmake都会尝试去加载相应的 xxx.prf 文件
- 加载 default_post.prf 文件
分享到:
相关推荐
QT项目,C++,该工具是windows环境下的工具,将QT的工程项目文件.pro,转换成CMakeLists.txt,也就是说将qmake转换成cmake,使用方法,解压缩后,打开 Windows PowerShell ,进入到解压缩后的目录,再使用命令 ...
`qmake`是Qt框架提供的一个构建工具,主要用于管理Qt项目的编译过程。然而,随着C++和软件工程的发展,`cmake`逐渐成为更通用、跨平台的构建系统,能够支持多种编译器和项目结构。本篇文章将详细介绍如何将Qt项目的`...
在软件开发过程中,Makefile和qmake是两个重要的构建工具,尤其在C/C++编程领域。它们用于自动化编译、链接和其他构建过程,确保代码能够高效地被组织和管理。 **1. Makefile** Makefile是Unix/Linux系统下的一种...
qmake使用手册 qmake是Trolltech公司创建的用于生成Makefile的工具,可以根据不同的平台和编译器书写Makefile。使用qmake,开发者可以创建一个简单的项目文件,并且运行qmake生成适合的Makefile。qmake会注意所有的...
这个是单独的qmake.exe工具,如果不想安装qt的相关的包仅仅想使用QT creator。
#### 二、QMake与Qt的关系 Trolltech公司(现为The Qt Company)使用QMake作为其Qt库及工具集的主要构建工具。这意味着Qt项目不仅能够利用QMake轻松构建,还能自动处理与Qt相关的特定需求,例如自动生成moc(元对象...
从给定的文件信息来看,主要关注的是QT4中的qmake手册,这涉及到Qt框架的构建工具qmake的使用和理解。以下是对标题、描述、标签以及部分内容中提及的知识点的详细解读: ### QT4 qmake 手册 **qmake**是Qt提供的一...
Qt5.14.2交叉编译配套qmake.conf文件
#### 二、简单应用 ##### 2.1 创建项目文件 qmake 使用项目文件(.pro 文件)来确定如何生成 Makefile 文件。一个基本的 .pro 文件通常包括应用程序的源代码文件、头文件以及一些配置选项。 - **SOURCES**:用于...
#### 二、qmake的使用方式 ##### 1. 基本使用 - **生成Makefile**:运行`qmake yourproject.pro`命令即可基于`.pro`项目文件生成Makefile。 - **编译项目**:生成Makefile后,执行`make`(Unix/Linux系统)或`...
在使用Qt开发环境时,有时会遇到`qmake`找不到的问题。这通常是因为系统路径设置不正确,或者Qt的安装路径未被系统识别。本文将详细介绍如何解决`qmake`找不到的问题。 首先,当在终端输入`qmake -v`时,如果出现`...
qmake的介绍 qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。 手写Makefile是比较困难并且容易出错的,尤其是需要给不同的平台和编译器组合写几个Makefile。使用qmake,开发者创建一个...
QXMPP库是一个用C++编写的轻量级、易于使用的XMPP框架,它与Qt库紧密结合,利用qmake构建系统,方便在Qt环境中开发XMPP应用。这个源码包特别提到了使用qmake版本,意味着它适用于那些已经安装了Qt和Visual Studio...
在软件开发领域,Qt是一个非常流行的跨平台应用程序开发框架,而qmake和Qt Creator是Qt开发环境中的两个重要工具。本教程将深入探讨这两个工具的使用,帮助开发者更好地理解和利用它们进行高效开发。 **qmake简介**...
#### 二、qmake工作原理 qmake 主要是基于项目文件中的信息来生成 Makefile 的。项目文件由开发人员创建,通常较为简单,但对于复杂项目可能需要更复杂的项目文件。qmake 支持多种特性,包括: - 自动包含 Qt 工具...
qmake用户手册,感兴趣的朋友,可以下载看看,不需要资源分
**QMake 使用技巧详解** QMake 是 Qt 开发框架中的一个重要工具,用于自动化构建过程,帮助开发者生成项目文件,使得构建应用程序变得更加简单。本篇将深入探讨 QMake 的使用技巧和常见问题的解决方法。 ### 1. **...
通过使用`.qrc`文件,开发者可以声明和组织这些资源,并使用qmake将其编译进最终的二进制文件。这样做的好处包括资源的一体化管理、版本控制的简化以及防止因外部文件缺失导致的运行时错误。 在"港湾网络的教学材料...
#### 二、qmake的特点与优势 1. **跨平台支持**:qmake 支持多种操作系统(如 Windows、Linux、macOS 等)和编译器(如 GCC、Clang、MSVC 等)。 2. **简化构建过程**:通过使用 .pro 文件,开发者可以轻松管理项目...
### 如何使用qmake连接第三方库SDL 在开发过程中,我们常常需要利用各种第三方库来扩展项目的功能。其中,SDL(Simple DirectMedia Layer)库是一个跨平台的多媒体库,广泛应用于游戏开发等领域,用于处理图形、...