> 文章列表 > QMake宏定义常量和字符串或带空格的字符串(在代码中使用)

QMake宏定义常量和字符串或带空格的字符串(在代码中使用)

QMake宏定义常量和字符串或带空格的字符串(在代码中使用)

答案

  1. 宏定义常量
DEFINES += EXPIR_TIME=123
  1. 宏定义字符串(不带空格)
DEFINES += NIHAO=\\\\\\"nihao\\\\\\"
  1. 宏定义字符串(带空格也适用于不带空格的情况) 推荐
DEFINES += NIHAO=\\"\\\\\\"ni" "hao\\\\\\"\\"

QMAKE宏定义常量

环境: visual studio 2018 QT5.9.8
首先我们要知道 qmakepro文件转换为makefile文件。最后在使用visual studionmake使用编译器cl将程序编译出来。所谓的宏定义不过是,在使用cl编译器进行编译时,指定对应的选项选择对应的值罢了。
了解 visual studio 命令行编译
MSVC 编译器选项 /D
那么在qmake中是如何使用该选项的呐?
QMake宏定义常量和字符串或带空格的字符串(在代码中使用)
没错就是DEFINES
QMake宏定义常量和字符串或带空格的字符串(在代码中使用)
可得在qmake中定义常量宏得方式为。如

DEFINES += EXPIR_TIME=123

观察生成的makefile文件
QMake宏定义常量和字符串或带空格的字符串(在代码中使用)
发现确实如此

#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;
}
  • 字符串不带空格的情况

假设`NIHAO="nihao"`在命令行中我们需要这么操作,才能够被正常识别到

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文件
QMake宏定义常量和字符串或带空格的字符串(在代码中使用)
没有问题。

  • 字符串有空格的情况

有坑
根据上面的说法

DEFINES += NIHAO=\\"\\\\\\"ni hao\\\\\\"\\"

即可定义一个带空格字符串宏,因为转义后

"\\"ni hao\\""

但是实际 qmake转义为
QMake宏定义常量和字符串或带空格的字符串(在代码中使用)
程序输出为

ni -Dhao

经过楼主一番好找,找到了解决方案

DEFINES += NIHAO=\\"\\\\\\"ni" "hao\\\\\\"\\"

需要在空格字符左右在加上 引号 ,这可能是qamke自己规定的
Use name with whitespace for qmake TARGET variable
qmake转义后为
QMake宏定义常量和字符串或带空格的字符串(在代码中使用)
没有问题,程序输出符合预期