qmake介绍

qmake介绍文章目录简单介绍下qmake简要介绍关于pro文件构建一个项目使用第三方库预编译头文件让我们开始试试吧从一个简单的例子开始允许程序可以Debug添加特定平台的源文件设置当文件不存在的时候就停止qmake检查多个条件qmake可以帮助我们在跨平台构建应用程序的时候变得更简单,我们可以通过写简单的几行必要的信息来生成构建文件,我们可以在任何的软件项目中使用qmakeqmake基于pro文件生产构建…

大家好,又见面了,我是你们的朋友全栈君。

qmake可以帮助我们在跨平台构建应用程序的时候变得更简单,我们可以通过写简单的几行必要的信息来生成构建文件,我们可以在任何的软件项目中使用qmake

qmake基于pro文件生产构建文件,pro文件是由开发者创造的,它的用法也很方便,但是越复杂的应用程序,需要的pro文件越复杂

qmake的包含一些附加特性来支持Qt的开发,他将会自动的包含对于moc和uic的规则

qmake同样也可以在开发者不更改pro文件的时候生成VisualStudio的项目文件

简单介绍下qmake

简要介绍

qmak工具是一个面向项目的系统,可以帮助应用程序,库,或者其他的组件的的构建,这一特性让你对应用程序的控制不仅局限于包含文件,构建过程中的每一步都可以被描述。而且这一过程都在编辑一个文件来实现,qmake将每一个项目文件中的信息展开成一个Makefile,这一步是在编译和连接过程中必须的

关于pro文件

项目是pro文件所描述的,qmake使用这个文件中的信息来构建每一个项目,项目文件主要包含源文件和头文件的引用,生成配置信息,还有其他任何的应用程序指定的细节,比如引用额外的库来链接,或者其他的include路径
pro文件包含很多不同的信息,包括注释,变量声明,内置函数,还有一些简单的控制结构,在最简单的pro文件中,仅仅声明了头文件和源文件,还有一些基本的配置选项,更多的细节请看:如何创造一个简单的pro文件
对于更复杂的项目,你可以创造更复杂的项目文件,关于pro文件的介绍,可以看一下如何创造项目文件一节,更多的关于pro文件的信息,可以看下参考
你可以使用应用或者库模板来指定构建配置选项进而确定构建构成,更多的信息,可以看构建常规的项目类型这一节
你可以使用Qt Create new project wizard命令来创造一个pro文件,你选择项目模板后,Qt Creater将会创造一个默认的pro文件来让你可以构建和运行项目,你可以修改pro文件来设置你的目标
你也可以使用qmake来生成pro文件,更多的信息请看Running qmake
这些基础的配置特性可以生成跨平台的项目,然而一定是有用的,详细的请看Platform Notes

构建一个项目

对于简单的项目,你只需要运行顶层文件件夹中的qmake来生成makefile,你可以运行你的平台构建构工具通过makefile来构建项目

使用第三方库

Thrid Party Libraries显示了如何使用简单的构建第三方库

预编译头文件

在大型的项目中,你可以设置预编译头文件来提高项目的编译速度,详细的请看 Using Precompiled Headers

让我们开始试试吧

这个教程将叫你qmake的基础,下面的几个子章节将简单介绍下qmake的用法

从一个简单的例子开始

我们假定你已经完成了应用程序的基本实现,假定你已经创造了如下的文件

  • hello.cpp
  • hello.h
  • hello.cpp

现在唯一要做的就是在qt中写下如何设置应用程序,首先,使用你喜欢的编辑器,创造一个名为hello.pro的文件,下面需要做的就是在这个文件中添加上一些命令,来告诉qmake关于源文件和头文件是你开发的项目中的一部分
所以我们首先在pro文件中添加源文件的信息,你需要使用SOURCES变量,新开一行,然后写上SOURCES += 然后写上hello.cpp

SOURCES += \
    hello.cpp \
    main.cpp

HEADERS += \
    hello.h

目标名将会自动设置,默认情况下和项目名称相同,但是其后缀要是和现在的平台,举个例子,如果pro文件名为hello.pro,目标文件在windows上将会是hello.exe,然后再Unix上将是hello。如果你设置一个不同的名字,你可以这样设置

TARGET = helloword

现在你可以使用qmake来生成你应用的Makefile,在你的pro文件中,你可以写下

qmake -o Makefile hello.pro
//但是我现在不知道qmake放在前面是什么意思,这样会导致遍历pro文件时无法通过

允许程序可以Debug

一般来讲Release版本的应用程序不包含debug的语法或者其他的debug的信息,但是在应用的开发阶段,在应用程序中包含可以debug的信息是很有必要的,在qt中可以通过添加debug信息来允许应用程序可以debug
比如:

  CONFIG += debug
  HEADERS += hello.h
  SOURCES += hello.cpp
  SOURCES += main.cpp

然后像之前一样使用qmake来生成makefile,这样的话,你将会在程序运行过程中得到有用的debug信息

添加特定平台的源文件

在程序开始开发后,你可能开始需要针对不同的平台开发应用程序,这时候你可能需要分离代码,这样你将会有两个新的文件在你的pro文件中,一个是 hellowin.cpp,一个是hellounix.cpp,但是再Qt中你可以在pro中通过设置选择需要添加哪些额外的文件,比如这样:

win32 { 
   
    SOURCES += hello.cpp
}

当为windows开发应用程序的时候,添加hellowin.cpp来源文件中,当构建其他平台的应用程序的时候,qmake将会忽视他们,比如这样

  CONFIG += debug
  HEADERS += hello.h
  SOURCES += hello.cpp
  SOURCES += main.cpp
  win32 { 
   
      SOURCES += hellowin.cpp
  }
  unix { 
   
      SOURCES += hellounix.cpp
  }

设置当文件不存在的时候就停止qmake

你可能会想如果某个文件不存在的时候就停止生成makefile,我们可以使用exit()函数来检查某个文件是否存在,我们可以使用函数error()来停止qmake构建,这个和作用域的功能相同,比如这样:

  !exists( main.cpp ) { 
   
      error( "No main.cpp file found" )
  }

好了,现在你的pro文件看起来像这样

  CONFIG += debug
  HEADERS += hello.h
  SOURCES += hello.cpp
  SOURCES += main.cpp
  win32 { 
   
      SOURCES += hellowin.cpp
  }
  unix { 
   
      SOURCES += hellounix.cpp
  }
  !exists( main.cpp ) { 
   
      error( "No main.cpp file found" )
  }

检查多个条件

如果你在使用windows的话,当你在命令行模式使用应用程序的时候,相通过使用函数qDebug()来输出你想要的状态,你一定使用适当的控制台设置来构建你的应用,我们可以方便的在CONFIG中添加console命令,这样的话就会在在makefile的时候,包含相关的命令,假设当我们仅在window模式下,并且只在debug的模式下来应用此功能,需要这样做

  win32 { 
   
      debug { 
   
          CONFIG += console
      }
  }

这时候你的pro文件看起来是这个样子

  CONFIG += debug
  HEADERS += hello.h
  SOURCES += hello.cpp
  SOURCES += main.cpp
  win32 { 
   
      SOURCES += hellowin.cpp
  }
  unix { 
   
      SOURCES += hellounix.cpp
  }
  !exists( main.cpp ) { 
   
      error( "No main.cpp file found" )
  }
  win32:debug { 
   
      CONFIG += console
  }

创建项目文件

pro文件包含所有的qmake用来构建应用程序的信息,这包括了库,插件,货真你使用的一系列的声明的源文件,不过要想让同一个程序跨平台,就需要包含不同的描述平台的文件

pro文件基础

qmake使用的pro文件可以用来构建简单或者复杂的系统,简单的pro文件可以用直接的声明方法,定义标注的变量来声明项目使用的头文件和源文件;复杂的项目可能需要控制流式的架构来定义构建流程
下面的章节描述了了不同的项目文件的不同类型

变量

在项目文件中,变量通常是包含一串字符串,在最简单的项目中,这些变量告诉了qmake有关于配置的选项,或者一些在构建过程中的路径
qmake在每一个pro文件中寻找包含的变量,这些内容将决定应该向makefile中写入什么,举个例子,在HEADERS和SOURCES中的变量来告诉qmake关于头文件和源文件的信息。
变量也可以由内部使用来储存一些临时的列表,而且可以用新值来复写已经存在的值
下面的显示了如何为变量指定值

HEADERS = mainwindow.h paintwidget.h

然后变量中的值按照如下的方式来拓展

  SOURCES = main.cpp mainwindow.cpp \
            paintwidget.cpp
  CONFIG += console

在其中 CONFIG 是一个特殊的变量,qmake用它来生成makefile,在之前的章节中讲过, console 是添加到现有的CONFIG变量中的

变量 描述
CONFIG 项目的基本配置选项
DESTDIR 存放库文件和二进制文件的目录
FORMS 所有使用过的UI文件
HEADERS 头文件
QT 使用的QT的模块
RESOURCES 所有的资源文件
SOURCES 所有的源文件
TEMPLATE 项目的模板,声明了应用程序是一个应用,还是一个库,或者一个插件

变量的内容可以通过在前面加一个$$来读取,这样就可以使用一个变量来赋值给另外一个变量了
比如

  TEMP_SOURCES = $$SOURCES

$$操作符是一个很常用的用来操作字符串或者值得内置函数

关于空白

通常来讲,空白分割了变量的值,如果指定的变量中包含空格,那就需要在外面加上双引号,比如:

  DEST = "Program Files"

下面描述了两个包含空格的实例

  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.

内置函数和控制流

qmake提供了一系列的内资函数,来使用变量所处理的内容,最普通的情况下使使用include()函数,然后再里面包含一个文件名来作为一个内容,这些给定文件的内容会包含在本文件中,比如:

  include(other.pro)

对条件结构的支持是使用{}来实现的,类似于if语句

  win32 { 
   
      SOURCES += paintwidget_win.cpp
  }

{}内部的语句只有在条件满足的时候才只能,win32 CONFIG选项如果在WIndows平台编程的时候一定会自动的加上
还有更复杂的内置函数,比如find(),unique(),count,这些函数目的都是方便我们操作字符串和变量,来支持用户输入,或者调用其他的工具,更多的信息请看qmake language

项目模板

TEMPLATE 变量用来定义项目将要构建的类型,如果没有在项目文件中声明,qmake将默认生成Application,并由此生成一个makefile的作为目的
下面的是可用模板类型

模板 qmake输出
app(默认) 生成一个应用
lib 生成一个库
aux 不构建任何东西,当我们没有编译器的时候,或者解释语言的时候使用这个选项
subdirs MakeFile包含由SUBDIRS指定的规则,每一个子目录都包含它自己的pro文件
vcapp 构建VisualStudio项目文件
vclib 构建lib
vcsubdirs 构建VisualStudio的subdirs

在写app和lib的时候可以参考 Buliding Common Project Types
当使用 subdir 模板的时候,qmake生成一个MakeFile的时候要搜索所有的子文件夹,并执行路径下的每一个pro文件,并且运行平台的 make工具在新创建的Makefile上,SUBDIRS变量用来包含一系列的子目录

常规配置属性

变量 CONFIG 指定了项目所需要的配置的选项和特征
项目可以在release模式或者debug模式下运行,或者两个模式都运行,如果debug和release模式都狮子那个了,那么生效的将会是最后一个,如果你指定了 dubug_and_release选项来构建项目的debug和release版本,qmake所生成的Makefile将包含一个语句用来生成所有的版本,如下:

make all

在CONFIG选项中添加build_all选项来指定在构建的时候生成两个版本的程序
注意:在CONFIG下的每一个选项都需要包括在花括号中,你可以使用函数CONFIG()来判断是否opengl选项正在使用,如下:

  CONFIG(opengl) { 
   
      message(Building with OpenGL support.)
  } else { 
   
      message(OpenGL support is not available.)
  }

如果要在debug和release选项中使能不同的配置选项,可以使用release和dubug花括号,更多的信息可以查看 Using Scopes
下面的选项定义了项目的构建的类型
注意:一些设置只有在使用相关的平台的时候才起作用

选项 描述
qt 此项目是Qt应用程序,应该将此应用程序连接到Qt的库中,你可以根据你的实际应用程序使用QT的的变量来控制任何附加的Qt模块,此值是默认添加的,但是你可以在不创建Qt应用程序的时候在qmake中删掉
x11 本项目是一个 C++ X11 的应用程序后者库,这个变量在使用Qt的时候不是必须的

应用程序和库模板 可以提供给你更多特别的选项,目的是使应用程序的构建更好,这些选项在下面的章节中将展示
举个例子,如果你的应用程序使用Qt库,并且你想在debug模式下构建,你的pro文件需要包含

CONFIG += qt debug

声明Qt的库

如果CONFIG变量包含qt这个值,qmake将会支持Qt应用程序,这样的话就可以使用以下的格式来声明Qt中带的库

QT += network xml

注意:
默认情况下,QT 会包含core 和gui模块,所以不能使用=来添加还需要使用的模块,而应该使用+=
如果不想使用gui模块,需要使用 -= 符号,如下所示:

QT -= gui

详细的关于Qt模块的列表,请看QT

配置特性

qmake可以使用额外的配置特性,需要卸载prf文件中,这些额外的属性通常是来支持在构建过程中使用的定制的工具,为了在构建过程中添加这些特性,使用变量CONFIG来添加特征的名字
比如,qmake可以配置构建阶段,使其可以利用额外的库,需要使用pkgconfig的支持,比如D-bus和ogg库,如下:

CONFIG += link_pkgconfig
PKGCONFIG += ogg dbus-1

详细的可以看下面的章节

声明其他的库

如果你需要在你的项目中添加其他的库,你需要在你的pro文件中指定
你可以使用unix风格的,命令行来声明其他的库,比如

LIBS += -L/usr/local/lib -lmath

需要需要添加额外的头文件的话,可以使用INCLUDEPATH变量,比如:

INCLUDEPATH = c:/msdev/include d:/stl/include

让我们开始创建一个普通的项目吧

这一章主要描述如何来设置qmake项目文件,这三种常见的pro文件分别是 Qt::Application,Qt::library,Qt::plugin,我们会发现尽管项目的名称相同,但是通过设置不同的pro文件,我们最终可以得到不同的结果

Application的构建

app模板告诉qmake来生成一个用于构建一个application的Makefile,在这个模板的帮助下,application的类型,可以通过下面的配置文件来指定

Option Description
windows 使用GUI的应用程序
console 使用控制台的应用程序
testcase 应用程序是一个自动化测试

当使用这个模板的时候,下面的qmake变量是需要认识的,你可以在你的pro文件中来指定你的应用程序的信息,更多的跨平台的变量,可以看platform notes

  • HEADERS – 应用程序的头文件列表
  • SOURCES – C++源文件列表
  • FORMS – 应用程序使用的UI文件
  • LEXSOURCES – 应用程序使用的Lex源文件
  • YACCSOURCES – 应用程序使用的Yacc源文件
  • TARGET – 要生成的应用程序的名字,默认的名字是项目的文件名
  • DESTDIR – 目标可执行文件所处的目录
  • DEFINES – 在应用程序中所定义的任何附加的预处理器
  • INCLUDEPAth – 应用程序中定义的任何附加的包含路径
  • VPATH – 关于需要搜索的文件的路径
  • DEF_FILE – 只有在windows平台中才可以使用,可以来反对应用程序的.def文件

如果你不需要加额外的配置,你可以不加,Qt会自己加上一些必要的选项,如下:

TEMPLATE = app
DESTDIR = c:/helloapp
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
DEFINES += USE_MY_STUFF
CONFIG += release

构建一个testcase

一个testcase项目是一个app项目,目的是来运行自动化的测试,任何app可能都需要进行一些测试用例,我们通过在CONFIG便令中添加testcase来实现
对于一个testcae项目,qmake将会在生成的Makefile文件中插入一个check目标,这个目标将会在应用中运行,如果这个测试没有达到预期的结果,将返回0
check目标自动的在SUBDIRS中递归的添加,这意味着在整个测试过程中,将会报出一个check命令
check目标的执行可以被具体的Makefile变量所定制,这些变量是

变量 描述
TESTRUNNER 这个命令将添加在每一个测试请求中,如果程序没有在规定时间内完成,将会报出超时的问题
TESTAGES 这个命令将添加在每一个测试请求中,比如,这对通过附加的指令来设置测试的输出文件或格式(比如: -o filename, 这些选项有 QTestLib来阐述)

构建一个库

lib模板告诉qmake来生成一个Makefile,此makefile将构建一个库,当时用此模板的时候,需要变量VERSION来支持,除了app模板所支持的系统变量,可以在pro文件中使用变量,来制定库的信息
当使用lib模板时,下面的选项需要添加在变量CONFIG中,让Qt知道需要生成什么类型的库

Option Description
dll 动态链接库
staticlib 静态链接库
plugin 插件

下面的选项同样可以在库中被定义

  • VERSION – 目标库的版本,比如 2.3.1

构建一个插件

插件是需要lib模板支持的,如前面的章节所说,它告诉qmake来生成一个项目的makefile,用来对每一个平台构建一个插件,通常是用一个library的相识,和原生的库一样,VERSION变量同样也适用于插件

构建一个QtDesigner 插件

使用

QT += widgets designer

构建和安装在Debug和Release模式

有时候,有必要同时生成debug和release模式的文件,尽管CONFIG变量可以同时包括debug和release选项,但是只有最后一个指定的才生效

构建所有的模式

为了让项目可以同时构建所有的模式,你需要添加CONFIG中 debug_and_release选项:

CONFIG += debug_and_release

CONFIG(debug, debug|release) { 
   
	TARGET = debug_binary
}	else { 
   
	TARGET = release_binary
}

花括号里面的内容的目的是为了确保结果的目标文件有不同的名字,这样做的目的是为了让两个名字不相互覆盖
让qmake构建项目文件的时候,它将会生成一个makefile的规则,这个规则允许项目构建所有的模式,可以通过如下的命令来调用

make all

在所有的模式下安装

运行qmake

qmake的特性在有很多不同变量的选项下的时候可以被定制,他们允许构建过程可以被优化,提供有用的诊断信息,并且可以被用于指定项目的目标平台

请求语法

下面的语法来执行qmake

qmake [mode] [options] files

操作模式

qmake支持两个不同的操作模式,在默认的模式下,qmake使用pro文件中的信息来生成一个makefile,但是它同样有可能使用qmake来生成pro文件,如果你想来显示的设置这个模式,你一定在所有其他的选项中定义它,mode可以是下面的两个值

  • makefile – qmake输出一个makefile
  • project – qmake输出
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/144421.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号