`
tomhibolu
  • 浏览: 1431568 次
文章分类
社区版块
存档分类
最新评论

qmake 乱乱乱谈(二)

 
阅读更多

接前面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

可以设置环境变量 QMAKEFLAGS ,该变量的值将直接作为qmake的参数使用

如果qmake的参数与QMAKEFLAGS指定的冲突,qmake的命令行参数起作用。

  • 环境变量QMAKESPEC

如果 QMAKEFLAGS 和命令行参数中都没有指定 mkspec,那么将尝试查找环境变量 QMAKESPEC

  • cache

你可能见过 .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

两个文件的内容如下:

  • test.pro

message($$CONFIG)
  • .qmake.cache

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 文件

分享到:
评论

相关推荐

    qmake转换cmake工具

    QT项目,C++,该工具是windows环境下的工具,将QT的工程项目文件.pro,转换成CMakeLists.txt,也就是说将qmake转换成cmake,使用方法,解压缩后,打开 Windows PowerShell ,进入到解压缩后的目录,再使用命令 ...

    qmake转cmake写法

    `qmake`是Qt框架提供的一个构建工具,主要用于管理Qt项目的编译过程。然而,随着C++和软件工程的发展,`cmake`逐渐成为更通用、跨平台的构建系统,能够支持多种编译器和项目结构。本篇文章将详细介绍如何将Qt项目的`...

    Makefile及Qmake详解

    在软件开发过程中,Makefile和qmake是两个重要的构建工具,尤其在C/C++编程领域。它们用于自动化编译、链接和其他构建过程,确保代码能够高效地被组织和管理。 **1. Makefile** Makefile是Unix/Linux系统下的一种...

    qmake使用手册.pdf

    qmake使用手册 qmake是Trolltech公司创建的用于生成Makefile的工具,可以根据不同的平台和编译器书写Makefile。使用qmake,开发者可以创建一个简单的项目文件,并且运行qmake生成适合的Makefile。qmake会注意所有的...

    qmake可执行文件

    这个是单独的qmake.exe工具,如果不想安装qt的相关的包仅仅想使用QT creator。

    QMake指南(高级技巧)

    #### 二、QMake与Qt的关系 Trolltech公司(现为The Qt Company)使用QMake作为其Qt库及工具集的主要构建工具。这意味着Qt项目不仅能够利用QMake轻松构建,还能自动处理与Qt相关的特定需求,例如自动生成moc(元对象...

    QT4 qmake 手册

    从给定的文件信息来看,主要关注的是QT4中的qmake手册,这涉及到Qt框架的构建工具qmake的使用和理解。以下是对标题、描述、标签以及部分内容中提及的知识点的详细解读: ### QT4 qmake 手册 **qmake**是Qt提供的一...

    qmake.conf 文件

    Qt5.14.2交叉编译配套qmake.conf文件

    qmake 使用详解

    #### 二、简单应用 ##### 2.1 创建项目文件 qmake 使用项目文件(.pro 文件)来确定如何生成 Makefile 文件。一个基本的 .pro 文件通常包括应用程序的源代码文件、头文件以及一些配置选项。 - **SOURCES**:用于...

    qmake使用指南

    #### 二、qmake的使用方式 ##### 1. 基本使用 - **生成Makefile**:运行`qmake yourproject.pro`命令即可基于`.pro`项目文件生成Makefile。 - **编译项目**:生成Makefile后,执行`make`(Unix/Linux系统)或`...

    qt-qmake找不到的解决办法1

    在使用Qt开发环境时,有时会遇到`qmake`找不到的问题。这通常是因为系统路径设置不正确,或者Qt的安装路径未被系统识别。本文将详细介绍如何解决`qmake`找不到的问题。 首先,当在终端输入`qmake -v`时,如果出现`...

    qmake用户手册3.05中文版

    qmake的介绍 qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。 手写Makefile是比较困难并且容易出错的,尤其是需要给不同的平台和编译器组合写几个Makefile。使用qmake,开发者创建一个...

    qxmpp通信协议源码 qmake版本

    QXMPP库是一个用C++编写的轻量级、易于使用的XMPP框架,它与Qt库紧密结合,利用qmake构建系统,方便在Qt环境中开发XMPP应用。这个源码包特别提到了使用qmake版本,意味着它适用于那些已经安装了Qt和Visual Studio...

    qmake及QTCreator的使用教程

    在软件开发领域,Qt是一个非常流行的跨平台应用程序开发框架,而qmake和Qt Creator是Qt开发环境中的两个重要工具。本教程将深入探讨这两个工具的使用,帮助开发者更好地理解和利用它们进行高效开发。 **qmake简介**...

    qmake 手册 (初级部分 )

    #### 二、qmake工作原理 qmake 主要是基于项目文件中的信息来生成 Makefile 的。项目文件由开发人员创建,通常较为简单,但对于复杂项目可能需要更复杂的项目文件。qmake 支持多种特性,包括: - 自动包含 Qt 工具...

    qmake用户手册

    qmake用户手册,感兴趣的朋友,可以下载看看,不需要资源分

    qmake 使用技巧

    **QMake 使用技巧详解** QMake 是 Qt 开发框架中的一个重要工具,用于自动化构建过程,帮助开发者生成项目文件,使得构建应用程序变得更加简单。本篇将深入探讨 QMake 的使用技巧和常见问题的解决方法。 ### 1. **...

    QT Qmake ;............

    通过使用`.qrc`文件,开发者可以声明和组织这些资源,并使用qmake将其编译进最终的二进制文件。这样做的好处包括资源的一体化管理、版本控制的简化以及防止因外部文件缺失导致的运行时错误。 在"港湾网络的教学材料...

    qmake用户手册 qmake用户手册.pdf

    #### 二、qmake的特点与优势 1. **跨平台支持**:qmake 支持多种操作系统(如 Windows、Linux、macOS 等)和编译器(如 GCC、Clang、MSVC 等)。 2. **简化构建过程**:通过使用 .pro 文件,开发者可以轻松管理项目...

    qmake连接第三方库SDL

    ### 如何使用qmake连接第三方库SDL 在开发过程中,我们常常需要利用各种第三方库来扩展项目的功能。其中,SDL(Simple DirectMedia Layer)库是一个跨平台的多媒体库,广泛应用于游戏开发等领域,用于处理图形、...

Global site tag (gtag.js) - Google Analytics