简单例子

假设已经实现如下程序:

hello.cpp
hello.h
main.cpp

首先,使用编辑器,在上述文件目录下创建文件hello.pro.然后加入几行语句告诉qmake项目中的源文件和头文件。

使用 SOURCES 变量 加入源文件,例如:

SOURCES +=hello.cpp

加入所有源文件

SOURCES += hello.cpp
SOURCES += main.cpp

也可以使用Make-like语法形式。如下:

SOURCES = hello.cpp\
main.cpp

加入头文件

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

target 是自动设定的;就像project file 一样。但是不同的平台有不同的后缀。比如,如果project file 是 hello.pro,那么在Windows上target就是 hello.exe,而linux上则是 hello.如果使用不同的名称的话,可以这样设置project file:

TARGET = helloworld

设置 CONFIG变量的最后一步。由于是QT应用程序,必须把qt放入CONFIG中,这样qmake就会生成相应的链接库,并确保建立的moc和uic包含在生成的Makefile中。

最终的project file应该像这样:

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

现在就可以使用qmake来为应用程序生成Makefile。在项目目录下,输入命令行,如下:

qmake -o Makefile hello.pro

然后根据使用的编译器输入make和nmake

对于Visual Studio用户来说,qmake也会生成.dsp和.vcproj文件,比如:

qmake -tp vc hello.pro

使应用程序可调试

release版本的应用程序不包含任何调试符号或者其他的调试信息。在开发过程中往往需要调试版本提供相关的信息。这个很容易实现,只要在CONFIG变量中加入debug

例如:

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

像之前一样使用qmake产生Makefile,可以在debugging环境下,运行程序,得到有用的信息。

加入特定平台的源文件

在通过几个小时的编程后,有可能开始写特定平台部分,而且需要与其他代码独立分开。有两个新文件:hellowin.cpp和hellolinux.cpp.不能把它们都加入SOURCES变量中,这样两个文件都会在Makefile中。所以在运行qmake时,需要使用一个范围根据独立平台来处理。

一个适用于windows的简单范围,如下:

win32{
SOURCES += hellowin.cpp
}

如果qmake运行在Windows上,将hellowin.cpp加入到源文件列表中。如果qmake运行在其他平台上,就会被忽略。

现在剩下的就是为Unix-specific 文件创建一个范围,如下:

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

像之前一样使用qmake生成Makefile

如果文件不存在停止qmake

如果某些文件不存在,可能就不想创建Makefile.可以使用exists()函数来检查文件是否存在。使用error()函数来停止qmake.这和scopes的效果是一样的。简单的使用函数来代替scope 条件

检查main.cpp是否存在,如下:

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

!符号用来否定测试;例如,exists(main.cpp) 返回 true 则文件存在,如果 !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")
}

像之前一样生成makefile,如果重命名main.cpp,将会看到一些信息并且qmake会停止。

多条件检查

假设使用Windows ,在命令行运行应用程序时,希望能看到qDebug()的声明输出。如果构建的应用程序没有合适的控制设置,就不能看到输出。只要在CONFIG中加入console,makefile中就会有设置。然而,如果debug已经加入了CONFIG中,想在运行时,加入console。需要使用嵌套范围,例如:

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-how to的更多相关文章

  1. 【xcode】qt程序不通过qmake,运行找不到动态库的坑

    现象:试图在一个已有项目里增加qt的代码,因此手动加入相关framework(未通过qmake生成工程),编译连接都通过,但是运行时崩溃,提示错误: dyld: Library not loaded ...

  2. Qt qmake 使用(含遗留问题)

    网上在介绍编译Qt的教程中,大多数都是这样提到编译的: 1, 运行 VS2012 x86 Native Tools Command Prompt 批处理 2, cd <install qt5.0 ...

  3. 使用qmake构建程序(有关.pro和.vcproj编译选项对应关系)

    houjinxin 为了方便统一构建,准备使用qmake构建所有的vc工程,无论是否使用了Qt库,可是在网上找了几天,有几个选项根本就不知道怎么在pro里面配置,才能生成预期的vcproj文件... ...

  4. 利用qmake生成Makefile文件

    在linux下写程序,免不了要写Makefile文件,用automake,总感觉比较麻烦,linux人喜欢做麻烦的事,以显得风格迥异. 其实用qmake生成Makefile文件相当简单. 1 装好qm ...

  5. 翻译qmake文档 目录

    利用空闲时间把qmke的文档翻译出来,翻译水平有限,有些地方翻译的不好,请谅解, 如果您能指出来,我会很感激并在第一时候做出修改. 翻译qmake文档(一) qmake指南和概述 翻译qmake文档( ...

  6. 翻译qmake文档(四) Building Common Project Types

    翻译qmake文档 目录 本章原英文文档:http://qt-project.org/doc/qt-5/qmake-common-projects.html 构建常见的项目类型        本章描述 ...

  7. 翻译qmake文档(三) Creating Project Files

    翻译qmake文档 目录   原英文文档:http://qt-project.org/doc/qt-5/qmake-project-files.html   创建项目文件 项目文件包含qmake构建你 ...

  8. 翻译qmake文档(二) Getting Started

    翻译qmake文档 目录 原英文文档: http://qt-project.org/doc/qt-5/qmake-tutorial.html         本教程教讲授qmake基础知识.这个手册里 ...

  9. 翻译qmake文档(一) qmake指南和概述

    翻译qmake文档 目录 英文文档连接: http://qt-project.org/doc/qt-5/qmake-manual.html http://qt-project.org/doc/qt-5 ...

  10. qmake的使用

    [TOC] 本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso 本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso *** 还是先说 ...

随机推荐

  1. Vote Disk 和 OCR概述

    Oracle Clusterware由2部分组成,分别是Voting Disk和 OCR. Voting Disk里面记录着节点成员的信息. 如RAC数据库中有哪些节点成员,节点增加或者删除时也同样会 ...

  2. 把AVI存在资源中用TAnimate播放

    Animate1.RESName := 'About';  Animate1.Active := True;

  3. 进程间通信-Queue

    进程间通信-Queue Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信. 1. Queue的使用 可以使用multiprocessing模块的Queue实现多进程之间的数据传 ...

  4. cmd enabledelayedexpansion

    先来说说变量延迟扩展吧.当然,放狗一搜,就能看到满天飞的关于变量延迟扩展的文章,所以,我这里就简单介绍一下.先来看一段批处理: set str=test if %str%==test ( set st ...

  5. Appium客户端,命令行启动server

    目标:通过命令行启动Appium的server   1.通过命令行安装的Appium   直接命令行输入appium即可启动服务   2.安装的Appium客户端   可以查看客户端中打印的启动日志: ...

  6. 删除Eclipse已有的SVN资源库位置

    点击Eclipse菜单栏的[Window]->[Show View]->[Other],在弹出的对话框中,选择[SVN]->[SVN资源库],然后点击[OK]. 接着,在Eclips ...

  7. C++中的浅拷贝和深拷贝

    浅拷贝(shallow copy)与深拷贝(deep copy)对于值拷贝的处理相同,都是创建新对象,但对于引用拷贝的处理不同,深拷贝将会重新创建新对象,返回新对象的引用字.浅拷贝不会创建新引用类型. ...

  8. jquery datatables api

    原文地址 学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/ ...

  9. golang通过反射动态调用方法

    func Call(m map[string]interface{}, name string, params ...interface{}) ([]reflect.Value, error) { f ...

  10. mysql自定义函数收集

    代码: 查找字符串 in_string 中,存在多少个字符串 in_find_str delimiter $$ DROP FUNCTION IF EXISTS `fn_findCharCount` $ ...