qmake介绍

2022-08-31 09:37:51 浏览数 (1)

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

文章目录

  • 简单介绍下qmake
    • 简要介绍
    • 关于pro文件
    • 构建一个项目
    • 使用第三方库
    • 预编译头文件
  • 让我们开始试试吧
    • 从一个简单的例子开始
    • 允许程序可以Debug
    • 添加特定平台的源文件
    • 设置当文件不存在的时候就停止qmake
    • 检查多个条件
  • 创建项目文件
    • pro文件基础
    • 变量
      • 关于空白
      • 关于注释
      • 内置函数和控制流
    • 项目模板
    • 常规配置属性
    • 声明Qt的库
    • 配置特性
    • 声明其他的库
  • 让我们开始创建一个普通的项目吧
    • Application的构建
    • 构建一个testcase
    • 构建一个库
    • 构建一个插件
      • 构建一个QtDesigner 插件
    • 构建和安装在Debug和Release模式
      • 构建所有的模式
      • 在所有的模式下安装
  • 运行qmake
    • 请求语法
    • 操作模式

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

代码语言:javascript复制
SOURCES  = 
    hello.cpp 
    main.cpp

HEADERS  = 
    hello.h

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

代码语言:javascript复制
TARGET = helloword

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

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

允许程序可以Debug

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

代码语言:javascript复制
  CONFIG  = debug
  HEADERS  = hello.h
  SOURCES  = hello.cpp
  SOURCES  = main.cpp

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

添加特定平台的源文件

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

代码语言:javascript复制
win32 { 
   
    SOURCES  = hello.cpp
}

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

代码语言:javascript复制
  CONFIG  = debug
  HEADERS  = hello.h
  SOURCES  = hello.cpp
  SOURCES  = main.cpp
  win32 { 
   
      SOURCES  = hellowin.cpp
  }
  unix { 
   
      SOURCES  = hellounix.cpp
  }

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

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

代码语言:javascript复制
  !exists( main.cpp ) { 
   
      error( "No main.cpp file found" )
  }

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

代码语言:javascript复制
  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的模式下来应用此功能,需要这样做

代码语言:javascript复制
  win32 { 
   
      debug { 
   
          CONFIG  = console
      }
  }

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

代码语言:javascript复制
  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关于头文件和源文件的信息。 变量也可以由内部使用来储存一些临时的列表,而且可以用新值来复写已经存在的值 下面的显示了如何为变量指定值

代码语言:javascript复制
HEADERS = mainwindow.h paintwidget.h

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

代码语言:javascript复制
  SOURCES = main.cpp mainwindow.cpp 
            paintwidget.cpp
  CONFIG  = console

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

变量

描述

CONFIG

项目的基本配置选项

DESTDIR

存放库文件和二进制文件的目录

FORMS

所有使用过的UI文件

HEADERS

头文件

QT

使用的QT的模块

RESOURCES

所有的资源文件

SOURCES

所有的源文件

TEMPLATE

项目的模板,声明了应用程序是一个应用,还是一个库,或者一个插件

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

代码语言:javascript复制
  TEMP_SOURCES = $$SOURCES

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

关于空白

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

代码语言:javascript复制
  DEST = "Program Files"

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

代码语言:javascript复制
  win32:INCLUDEPATH  = "C:/mylibs/extra headers"
  unix:INCLUDEPATH  = "/home/user/extra headers"

关于注释

使用#

代码语言:javascript复制
  # Comments usually start at the beginning of a line, but they
  # can also follow other content on the same line.

内置函数和控制流

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

代码语言:javascript复制
  include(other.pro)

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

代码语言:javascript复制
  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将包含一个语句用来生成所有的版本,如下:

代码语言:javascript复制
make all

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

代码语言:javascript复制
  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文件需要包含

代码语言:javascript复制
CONFIG  = qt debug

声明Qt的库

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

代码语言:javascript复制
QT  = network xml

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

代码语言:javascript复制
QT -= gui

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

配置特性

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

代码语言:javascript复制
CONFIG  = link_pkgconfig
PKGCONFIG  = ogg dbus-1

详细的可以看下面的章节

声明其他的库

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

代码语言:javascript复制
LIBS  = -L/usr/local/lib -lmath

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

代码语言:javascript复制
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会自己加上一些必要的选项,如下:

代码语言:javascript复制
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 插件

使用

代码语言:javascript复制
QT  = widgets designer

构建和安装在Debug和Release模式

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

构建所有的模式

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

代码语言:javascript复制
CONFIG  = debug_and_release

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

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

代码语言:javascript复制
make all

在所有的模式下安装

运行qmake

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

请求语法

下面的语法来执行qmake

代码语言:javascript复制
qmake [mode] [options] files

操作模式

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

  • makefile – qmake输出一个makefile
  • project – qmake输出

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

0 人点赞