由于我的是多工程,所以自己做了脚本来编译,而且是bat调用qmake->nmake来编译。最终就是makefile规则。之前bat样例看这里:
http://labisart.com/blog/index.php/Home/Index/article/search_word/bat/aid/197
那么我给bat传参数时,最终是传到qmake和nmake,对qmake来讲,可以定义一个宏,然后在源代码里面进行访问,这就带来一个问题:如何宏定义字符串和数字。
首先说说规则,
pro里面:DEFINES += xxx
qmake命令行就少个+号:DEFINES = xxx
这个xxx默认是数字来的,比如 DEFINES = MYVALUE=2.0.0,那么cpp就解析为 MYVALUE = 2.0,而且是double。
如果定义 DEFINES = MYVALUE=iloveyou 这样的字符串,那么cpp直接引用会报错,因为不是字符串“iloveyou”。
这就涉及到宏定义如何在字符串和数字之间进行定义、转换,总的来说目前看到2钟方法:
1、使用转义符,把数字版本号转换为字符串版本号
例如我们定义软件版本时经常 VERSION=1.0.1,这个1.0.1直接传就变成1.0了,所以要变成字符串,看转义大法:
在pro中:
QTCREATOR_VERSION = 4.4.1 DEFINES += QTCREATOR_VERSION=\"\\\"$$QTCREATOR_VERSION\\\"\"
在qmake中:
DEFINES = APP_NAME=\\\"QtCreator\\\"
那么cPP中就可以当作QString来使用了。
2、还有种是#号大法
宏定义数字就不说了,直接引用。看下#号如何引用:
#define MATH_VALUE 123 #define STR_VALUE_(x) #x #define STR_VALUE(x) STR_VALUE_(x)
经过上述变换后,STR_VALUE就变成字符串了,当然,x可以是任意字符串,例如
STR_VALUE(abcd1234)
如果直接调用前面一个宏:
STR_VALUE_(x)
那么他只会把x当成字符串,而不是x的定义为字符串。
这样,我在qmake定义 DEFINES = APPNAME=qtcreator,
在cpp中只要使用
STR_VALUE(APPNAME);
就可以愉快的当作qstring来用了!