答案
- 宏定义常量
DEFINES += EXPIR_TIME=123
- 宏定义字符串(不带空格)
DEFINES += NIHAO=\\\"nihao\\\"
- 宏定义字符串(带空格也适用于不带空格的情况) 推荐
DEFINES += NIHAO=\"\\\"ni" "hao\\\"\"
QMAKE宏定义常量
环境: visual studio 2018
QT5.9.8
首先我们要知道 qmake
将 pro
文件转换为makefile
文件。最后在使用visual studio
的nmake
使用编译器cl
将程序编译出来。所谓的宏定义不过是,在使用cl
编译器进行编译时,指定对应的选项选择对应的值罢了。
了解 visual studio 命令行编译
MSVC 编译器选项 /D
那么在qmake
中是如何使用该选项的呐?
没错就是DEFINES
可得在qmake
中定义常量宏得方式为。如
DEFINES += EXPIR_TIME=123
观察生成的makefile
文件
发现确实如此
#include <QCoreApplication>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);qDebug() << EXPIR_TIME + 1;return a.exec();
}
程序输出
124
最后程序正常输出
qmake宏定义字符串
让我们先搭建起Windows
下使用msvc
命令行编译的环境
INCLUDE
E:\vs2015\VC\include
C:\Program Files (x86)\Windows Kits\10\Include\10.0.10150.0\ucrt
LIB
E:\vs2015\VC\lib
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10150.0\ucrt\x86
C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86
虽然不知道为什么但是在Windows
下,会从环境变量INCLUDE
下的路径去寻找头文件,会从环境变量LIB
下去寻找lib
文件链接。
在Windows
下,使用命令行操作时,参数的通常是通过 空格 来区分的。如果一个参数已经携带空格,那么就需要在这个参数上加上 双引号 这样才能识别。当然一个参数没有空格但是加上 双引号也是可以的。
#include <iostream>int main()
{std::cout << NIHAO << std::endl;return 0;
}
- 字符串不带空格的情况
E:\vs2015\VC\include>cl main.cpp -DNIHAO=\"nihao\"
用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.00.23026 版
版权所有(C) Microsoft Corporation。保留所有权利。main.cpp
E:\vs2015\VC\include\xlocale(341): warning C4530: 使用了 C++ 异常处理程序,但未启用展开语义。请指定 /EHsc
E:\vs2015\VC\include\exception(361): warning C4577: 'noexcept' used with no exception handling mode specified; termination on exception is not guaranteed. Specify /EHsc
Microsoft (R) Incremental Linker Version 14.00.23026.0
Copyright (C) Microsoft Corporation. All rights reserved./out:main.exe
main.obj
执行main.exe
E:\vs2015\VC\include>main.exe
nihao
也就是需要转义一次才行(我认为的)
- 字符串带空格的情况
假设 NIHAO="ni hao"
在命令行中我们需要这么操作,才能够被正常识别
E:\vs2015\VC\include>cl main.cpp -DNIHAO="\"ni hao\""
用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.00.23026 版
版权所有(C) Microsoft Corporation。保留所有权利。main.cpp
E:\vs2015\VC\include\xlocale(341): warning C4530: 使用了 C++ 异常处理程序,但未启用展开语义。请指定 /EHsc
E:\vs2015\VC\include\exception(361): warning C4577: 'noexcept' used with no exception handling mode specified; termination on exception is not guaranteed. Specify /EHsc
Microsoft (R) Incremental Linker Version 14.00.23026.0
Copyright (C) Microsoft Corporation. All rights reserved./out:main.exe
main.obj
运行生成的main.exe
E:\vs2015\VC\include>main.exe
ni hao
在qmake中,因为 qmake将 pro 文件生成 makefile 文件也需要转义一次,所以只要能够让生成的makefile文件 满足上面的要求,就能正确使用 qmake 定义一个字符串宏
- 字符串没有空格的情况
DEFINES += NIHAO=\\\"nihao\\\"
转义一次后
\"nihao\"
观察 makefile文件
没有问题。
- 字符串有空格的情况
有坑
根据上面的说法
DEFINES += NIHAO=\"\\\"ni hao\\\"\"
即可定义一个带空格字符串宏,因为转义后
"\"ni hao\""
但是实际 qmake
转义为
程序输出为
ni -Dhao
经过楼主一番好找,找到了解决方案
DEFINES += NIHAO=\"\\\"ni" "hao\\\"\"
需要在空格字符左右在加上 引号 ,这可能是qamke
自己规定的
Use name with whitespace for qmake TARGET variable
qmake
转义后为
没有问题,程序输出符合预期