接前面的qmake
乱乱乱谈(一)以及qmake 乱乱乱谈(二),本文看看qmake中的函数(Manual中有的就不重复了)。
函数分两种:
函数还可以分两种(真不知道怎么叙述):
- 返回值是布尔量的函数。(或者称为条件函数?)
- 内置函数中的 system()、exists()等用作条件的函数
- 内置函数中的 error()、return()、export()等不用做条件的函数
- 使用defineTest()定义的函数
- 函数调用时,前面不加 $$
- 以进行数据处理为目的的函数?返回值是处理结果。
- 内置函数中的dirname()、join()等
- 使用defineReplace()定义的函数
- 函数调用时,前面加 $$
函数用法
加不加$$ ?
前面提到,两类函数中,
- 一类前面不加$$,比如下面的exists和message
exists( $(QTDIR)/lib/libqt-mt* ) {
message( "Configuring for multi-threaded Qt..." )
CONFIG += thread
}
- 另一类前面要加 $$,比如下面的 basename
FILE = /etc/passwd
FILENAME = $$basename(FILE) #passwd
可是有没有疑问?
疑问?
system 有两种用法:
system(ls /bin):HAS_BIN=FALSE
UNAME = $$system(uname -s)
莫不是我们前面说的都是错的!!!
在看源码之前一直没搞清楚到底怎么回事。原来,有两个system函数,分别属于前面的两类。
- 前者,调用C语言的system函数,判断返回值是否为零
case T_SYSTEM:
if(args.count() < 1 || args.count() > 2) {
fprintf(stderr, "%s:%d: system(exec) requires one argument.\n", parser.file.toLatin1().constData(),
parser.line_no);
return false;
}
if(args.count() == 2) {
const QString sarg = args[1];
if (sarg.toLower() == "true" || sarg.toInt())
warn_msg(WarnParser, "%s:%d: system()'s second argument is now hard-wired to false.\n",
parser.file.toLatin1().constData(), parser.line_no);
}
return system(args[0].toLatin1().constData()) == 0;
case E_SYSTEM: {
if(args.count() < 1 || args.count() > 2) {
fprintf(stderr, "%s:%d system(execut) requires one argument.\n",
parser.file.toLatin1().constData(), parser.line_no);
} else {
char buff[256];
bool singleLine = true;
if(args.count() > 1)
singleLine = (args[1].toLower() == "true");
QString output;
FILE *proc = QT_POPEN(args[0].toLatin1(), "r");
while(proc && !feof(proc)) {
int read_in = int(fread(buff, 1, 255, proc));
if(!read_in)
break;
for(int i = 0; i < read_in; i++) {
if((singleLine && buff[i] == '\n') || buff[i] == '\t')
buff[i] = ' ';
}
buff[read_in] = '\0';
output += buff;
}
ret += split_value_list(output);
if(proc)
QT_PCLOSE(proc);
}
break; }
自定义函数
看例子:定义的两个函数都是叫func1,但类型不同
defineReplace(func1){
variable = $$1
message(replace_func $$variable)
return (variable)
}
defineTest(func1){
variable = $$1
message(test_func $$variable)
return (true)
}
NAME = dbzhang800
func1($$NAME):message(success)
ABC = $$func1($$NAME)
Project MESSAGE: test_func dbzhang800
Project MESSAGE: success
Project MESSAGE: replace_func dbzhang800
例子
- 看一个比较常用的(Qt feature文件中提供的)自定义函数:qtLibraryTarget
defineReplace(qtLibraryTarget) {
unset(LIBRARY_NAME)
LIBRARY_NAME = $$1
contains(TEMPLATE, .*lib):CONFIG(debug, debug|release) {
!debug_and_release|build_pass {
mac:RET = $$member(LIBRARY_NAME, 0)_debug
else:win32:RET = $$member(LIBRARY_NAME, 0)d
}
}
isEmpty(RET):RET = $$LIBRARY_NAME
return($$RET)
}
为调试版的库文件添加_debug或d后缀!
例子
函数内的如何获取参数:
defineReplace(func1){
message(\$\$1 $$1)
message(\$\$ARGS $$ARGS)
for(v, 1){
message($$v)
}
for(v, ARGS){
message($$v)
}
return ($$1)
}
NAME = dbzhang800 dbzhang801 dbzhang802
ABC = $$func1($$NAME)
#两个参数的要这么写(逗号不同于空格),然后,用$$2获取第二个参数,$$ARGS获取全部
#ABCD = $$func1($$NAME, $$NAME)
Project MESSAGE: $$1 dbzhang800 dbzhang801 dbzhang802
Project MESSAGE: $$ARGS dbzhang800 dbzhang801 dbzhang802
Project MESSAGE: dbzhang800
Project MESSAGE: dbzhang801
Project MESSAGE: dbzhang802
Project MESSAGE: dbzhang800
Project MESSAGE: dbzhang801
Project MESSAGE: dbzhang802
参考
分享到:
相关推荐
### 如何使用qmake连接第三方库SDL 在开发过程中,我们常常需要利用各种第三方库来扩展项目的功能。其中,SDL(Simple DirectMedia Layer)库是一个跨平台的多媒体库,广泛应用于游戏开发等领域,用于处理图形、...
QT项目,C++,该工具是windows环境下的工具,将QT的工程项目文件.pro,转换成CMakeLists.txt,也就是说将qmake转换成cmake,使用方法,解压缩后,打开 Windows PowerShell ,进入到解压缩后的目录,再使用命令 ...
- **依赖项**:检查你的`.pro`文件,确保所有依赖项(包括第三方库)都在`CMakeLists.txt`中得到处理。 - **调试信息**:在`qtcreator`中,可能需要调整`cmake`配置以获取与`qmake`相同的调试体验。 - **跨平台兼容...
在软件开发过程中,Makefile和qmake是两个重要的构建工具,尤其在C/C++编程领域。它们用于自动化编译、链接和其他构建过程,确保代码能够高效地被组织和管理。 **1. Makefile** Makefile是Unix/Linux系统下的一种...
qmake使用手册 qmake是Trolltech公司创建的用于生成Makefile的工具,可以根据不同的平台和编译器书写Makefile。使用qmake,开发者可以创建一个简单的项目文件,并且运行qmake生成适合的Makefile。qmake会注意所有的...
这个是单独的qmake.exe工具,如果不想安装qt的相关的包仅仅想使用QT creator。
#### 三、QMake的安装与配置 1. **默认安装**:当Qt被构建时,默认情况下QMake也会一同被构建。对于大多数用户而言,这通常是足够的。 2. **手动安装**:如果需要手动安装QMake,则需要设置以下环境变量: - **...
qmake能够自动处理项目依赖,包括Qt库以及其他第三方库的链接。这对于大型项目尤其重要,避免了手动配置依赖项的繁琐工作。 5. **自定义构建步骤:** 开发者可以通过.pro文件中的特定指令来添加自定义的构建步骤...
Qt5.14.2交叉编译配套qmake.conf文件
- **QXmppMessage**、**QXmppPresence**和**QXmppIq**:分别代表XMPP中的三种基本stanza类型:消息、存在状态和信息查询。 通过理解和掌握这些基础知识,开发者能够利用QXMPP库快速构建功能丰富的XMPP应用,例如...
#### 三、.pro文件详解 `.pro`文件是qmake的核心,用于定义项目结构、源文件列表、编译选项等。掌握其语法对于高效使用qmake至关重要。 ##### 1. 基本语法 - **项目类型**:通过`TEMPLATE`变量指定,如`app`...
在使用Qt开发环境时,有时会遇到`qmake`找不到的问题。这通常是因为系统路径设置不正确,或者Qt的安装路径未被系统识别。本文将详细介绍如何解决`qmake`找不到的问题。 首先,当在终端输入`qmake -v`时,如果出现`...
qmake的介绍 qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。 手写Makefile是比较困难并且容易出错的,尤其是需要给不同的平台和编译器组合写几个Makefile。使用qmake,开发者创建一个...
### qmake 使用详解 #### 一、简介与安装 **qmake** 是 Trolltech 公司开发的一款自动化生成 Makefile 的工具,适用于多种平台和编译器。它简化了跨平台项目的构建流程,使得开发者能够专注于编写代码而非管理构建...
在软件开发领域,Qt是一个非常流行的跨平台应用程序开发框架,而qmake和Qt Creator是Qt开发环境中的两个重要工具。本教程将深入探讨这两个工具的使用,帮助开发者更好地理解和利用它们进行高效开发。 **qmake简介**...
qmake用户手册,感兴趣的朋友,可以下载看看,不需要资源分
#### 三、入门指南 ##### 3.1 开始使用 qmake - **创建项目文件**:首先,需要创建一个项目文件(例如 `hello.pro`),并在此文件中指定项目的源代码和头文件。 - **指定源代码和头文件**:使用 `SOURCES` 和 `...
**QMake 使用技巧详解** QMake 是 Qt 开发框架中的一个重要工具,用于自动化构建过程,帮助开发者生成项目文件,使得构建应用程序变得更加简单。本篇将深入探讨 QMake 的使用技巧和常见问题的解决方法。 ### 1. **...
#### 三、qmake的安装 1. **环境变量设置**: - **QMAKESPEC**:此环境变量用于指定目标平台和编译器的组合。例如,对于 Windows 平台使用 Microsoft Visual Studio 编译器,则设置为 `win32-msvc`;对于 Solaris ...
QT和Qmake是Qt框架中的两个重要组成部分,用于软件开发。Qt是一个跨平台的应用程序开发框架,支持多种操作系统,如Windows、Linux、macOS等。它提供了丰富的图形用户界面(GUI)工具包,使得开发者可以方便地创建出...