Qt高级——QMake快速入门

Qt高级——QMake快速入门一、QMake简介qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。qmake是一个用来简化在不同平台间开发工程的构建过程的工具。qmake会自动生成MakeFile文件,可以用于任何软件项目中,无论是否由Qt编写。qmake会注意所有的编译器和平台的依赖性,开发者只需关注自己的代码。qmake作为Qt库和Qt所提供的工具的主要连编工具,可以自动的包含moc和uic的连编规则。二、QMake入门教程1、创建一个工程创建一个应用,包含hell

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

一、QMake简介

qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。

qmake是一个用来简化在不同平台间开发工程的构建过程的工具。qmake会自动生成MakeFile文件,可以用于任何软件项目中,无论是否由Qt编写。

qmake会注意所有的编译器和平台的依赖性,开发者只需关注自己的代码。qmake作为Qt库和Qt所提供的工具的主要连编工具,可以自动的包含moc和uic的连编规则。

二、QMake入门教程

1、创建一个工程

创建一个应用,包含 hello.cpp、hello.h、main.cpp三个文件。

使用文本编辑器创建一个hello.pro文件,增加源文件、头文件到工程文件hello.pro。

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

同时,也可以使用换行符一次增加多个文件。

SOURCES = hello.cpp \
          main.cpp

目标名称会自动设置,一般与工程文件相同,当会用后缀区别不同的平台。如,工程文件是hello.pro,Windows平台的目标名称是hello.exe,Unix平台的目标名称是hello。如果要使用不同的目标名称,需要在工程文件hello.pro中设置。如:

TARGET = helloworld

最后就是配置CONFIG变量,对于Qt应用程序来说,给CONFIG赋值qt,QMake会链接相关的库,并确保moc和uic相关的连编规则生成到MakeFile文件中。最终的hello.pro工程文件如下:

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

在工程所在目录打开命令行终端,使用qmake生成为应用生成MakeFile。

qmake -o Makefile hello.pro

对于Visual Studio开发者,qmake会生成.dsp或.vcproj文件。

qmake -tp vc hello.pro

2、增加工程的调试版

应用程序的 release版本不包含调试符号或其它调试信息。在开发过程中,生成带调试信息的应用程序调试版本是很有用的。通过增加debug到CONFIG变量可以生成应用程序的调试版本。

CONFIG += qt debug

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

3、增加特定平台的源文件

应用程序中特定平台部分的源码需要保持平台独立代码的分离。现在有hellowin.cpp和hellounix.cpp两个新文件。不能直接增加这两个文件到SOURCES变量,因为这会导致这两个文件直接生成到MakeFile文件,需要在qmake所运行的平台的代码块中独立处理。

对于Windows平台,在一个简单的代码块中增加平台独立的文件。

win32 {
    SOURCES += hellowin.cpp
}

如果qmake运行在Windows平台上,会增加hellowin.cpp文件到源文件列表。如果qmake运行在其它平台上,会忽略。现在创建一个代码块增加和Unix平台相关的文件。

unix {
    SOURCES += hellounix.cpp
}

工程文件hello.pro文件如下:

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

unix {
    SOURCES += hellounix.cpp
}

4、如果文件不存在中止qmake过程

如果某个文件不存在,不生成MakeFile文件。可以使用exists()函数检查一个文件是否存在。通过使用error()函数可以中止qmake执行过程。对main.cpp文件检查如下:

!exists( main.cpp ) {

    error( "No main.cpp file found" )
}

如果main.cpp文件存在,exists(main.cpp)为true。

如果main.cpp文件不存在,!exists(main.cpp)为true。

CONFIG += qt 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" )
}

5、检查多个条件

假设在Windows平台上,使用命令行运行应用程序,想通过qDebug()函数查看输出状态。除非在应用程序构建过程中使用console设置,否则看不到输出状态信息。通过将console增加到CONFIG变量可以在生成的MakeFile文件中生成相应的设置。

如果只在Windows平台上debug版本时查看输出信息。代码如下:

win32 {
    debug {
        CONFIG += console
    }}

内嵌的作用域也可以使用冒号(:)连接在一起。

CONFIG += qt 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
}

三、QMake创建工程

本文将讲述如何设置基于Qt的三种通用工程类型的qmake工程文件。

1、QMake创建应用程序

app模板会告诉qmake生成一个构建应用程序的MakeFile。使用app模板,应用的类型可以增加一个选项到CONFIG变量定义中。

windows:应用是一个Windows GUI应用程序

console:应用是一个Windows控制台应用。

使用app模板时,下列qmake系统变量会被识别,可以在应用程序的.pro文件中使用。

HEADERS:应用程序的头文件列表 

SOURCES:应用程序的源文件列表

FORMS:应用程序的UI(Qt Designer创建)文件列表

LEXSOURCES:应用程序的LEX原文件列表

YACCSOURCES:应用程序的YACC源文件列表

TARGET:应用程序的可执行文件名称

DESTDIR:生成的目标文件的存放目录

DEFINES:应用程序指定的预定义预处理器符号

INCLUDEPATH:编译器的搜索头文件路径

DEPENDPATH:应用程序的依赖查找路径

VPATH:寻找补充文件的搜索路径

DEF_FILE: 应用程序链接的.def文件,仅支持Windows。

RC_FILE:应用程序的资源文件,仅支持Windows。

RES_FILE:应用程序链接的资源文件,仅支持Windows。

开发者可以直接使用有值的qmake系统变量,不必指定任何值。qmake会自动增加需要的默认值。

实例工程文件如下:

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

对于单个值的数据项,如模板或目的目录,使用“=”,但多个值的数据项需要使用“+=”增加到已经存在相应类型的数据项中。如果使用“=”会使用新的值替换原来的值,例如,DEFINES=QT_DLL,所有其它的定义都会被删除。

2、QMake创建库

lib模板告诉qmake生成构建一个库的MakeFile。使用lib模板时,除了app模板支持的系统变量,也支持VERSION变量。可以使用这些变量在.pro文件中指定库的相关信息。当使用lib模板时,以下选项需要增加到CONFIG变量决定要构建的库的类型。

dll:库是一个共享库

staticlib:库是一个静态库

plugin:库是一个插件,也支持dll选项

VERSION变量指定库的版本信息

库的目标文件名是平台独立的。例如,X11和Mac OS X,库名称使用lib 前缀,Windows平台上,库文件名不增加任何前缀。

3、QMake创建插件

插件使用lib模板构建,告诉qmake生成一个工程的MakeFile。

VERSION变量用于指定插件的版本信息。

就像普通库一样,VERSION变量用于指定插件的版本信息。Qt Designer插件会使用一套依赖于Qt配置的特定配置集进行构建。为了方便起见,这些设置可以通过增加designer到工程CONFIG变量开启。例如:

CONFIG += designer plugin

4、QMake创建Debug Release

某些时候,构建同时支持debug和release的工程是必要的。虽然CONFIG变量有debug和release选项,但是debug选项会覆盖release选项。

为了开启工程同时支持debug和release,必须在CONFIG变量增加debug_and_release选项。

CONFIG += debug_and_release

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

以上代码块会修改每一种模式的构建目标,确保目标有不同的文件名称。为目标提供不同的名称可以确保目标相互间不会被覆盖。

当qmake处理工程文件时,会生成一个允许支持debug和release模式的MakeFile规则。可以通过以下方式调用:

make all

build_all选项增加到工程文件的CONFIG变量,可以确保工程默认会被两种模式编译。

CONFIG += build_all

这会允许Makefile使用默认规则处理。

make

build_all选项也可以确保目标的两个版本在安装规则被调用时被安装。

make install

可以自定义依赖于目标平台的构建目标的名称。例如,一个库或插件可以在Windows平台使用不同于Unix平台的命名规范。

CONFIG(debug, debug|release) {
    mac: TARGET = $$join(TARGET,,,_debug)
    win32: TARGET = $$join(TARGET,,d)
}

在debug模式构建时,以上代码块的默认行为会修改构建目标使用的名称。

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

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

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

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

(0)


相关推荐

  • yum安装与卸载软件常见命令「建议收藏」

    yum安装与卸载软件常见命令「建议收藏」1.使用yum安装和卸载软件,有个前提是yum安装的软件包都是rpm格式的。安装的命令是,yuminstall~,yum会查询数据库,有无这一软件包,如果有,则检查其依赖冲突关系,如果没有依赖冲突,那么最好,下载安装;如果有,则会给出提示,询问是否要同时安装依赖,或删除冲突的包,你可以自己作出判断;删除的命令是,yumremove~,同安装一样,yum也会查询数据库,给出解决依赖关…

  • pycharm安装包出现的错误

    pycharm安装包出现的错误1,先装python,在装pycharm,将python的路径添加到电脑路径的path中2,re是python自带的库,不需要再装了3,不放在虚拟环境中,创建项目,导入包的时候都要记得放在实际的python…exe中4,当出现不是正确版本的pip时(1)可能是pip版本过低,去cmd下载(2)网络太慢,在这里我是通过pipinstallddt-ihttp://pypi.douban.com/simple/–trusted-hostpypi.douban.com豆瓣源下载的,很快

  • java countdowntimer_Android 倒计时CountDownTimer[通俗易懂]

    java countdowntimer_Android 倒计时CountDownTimer[通俗易懂]image.png美工妹子给的图如下,订单在创建时间的24小时后进行关闭业务逻辑从后台返回来的订单创建时间加24小时后减去你当下的时间就是相差的总共时间,然后进行倒计时倒计时结束后上传订单关闭标识,改变状态页实现思路可能在没有遇到CountDownTimer之前,我们都是创建Handle来开启异步线程来处理,如果你现在使用,我只能说太菜了,官方已经为我们封装好了一个类,爽的很,一起来看@Overr…

  • 【转】细说.NET中的多线程 (六 使用MemoryBarrier,Volatile进行同步)

    【转】细说.NET中的多线程 (六 使用MemoryBarrier,Volatile进行同步)上一节介绍了使用信号量进行同步,本节主要介绍一些非阻塞同步的方法。本节主要介绍MemoryBarrier,volatile,Interlocked。MemoryBarriers本文简单的介绍一下这两个概念,假设下面的代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 usingSystem; .

  • Pycharm我认为最好看,最舒服的主题配色和字体设置

    Pycharm我认为最好看,最舒服的主题配色和字体设置File->Settings,如下图所示设置主题Editor->ColorScheme->Python,如下图所示,在右侧第一个框中下拉选择Twilight。这个主题看着就很舒服。设置字体Editor->General->Font,在右侧的Fonts是选择字体样式为Monospaced,大小Size设为18,行间距Linespacing设为1.2这样就设置完成啦!大概是这个样子,有没有觉得看起来hen舒服。如果有觉得更好的主题样式,欢迎大家一起来分享。

  • navicat15版本激活码_通用破解码[通俗易懂]

    navicat15版本激活码_通用破解码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

发表回复

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

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