我正在尝试在 C++ 中使用预处理器指令来避免编译需要 .lib 的代码,以防库无法链接。
我的 .pro 文件包含:
INCLUDEPATH += "C:/Program Files/Windows Kits/8.0/Include/um"
LIBS += -L"C:/Program Files/Windows Kits/8.0/Lib/win8/um/x86" -l"winscard"
我的指令是这样的:
#ifdef _WINSCARD_H_
// do something
#endif
或
#ifndef _WINSCARD_H_
// do something
#endif
此winscard 附带this windows sdk我绝对可以使用它的功能。当我尝试根据这些条件指令限制编译时,问题就出现了。
使用时代码编译良好p>
INCLUDEPATH += "C:/Program Files/Windows Kits/8.0/Include/um"
LIBS += -L"C:/Program Files/Windows Kits/8.0/Lib/win8/um/x86" -l"winscard"
在 .pro 文件中。
代码在编译阶段被跳过,就好像在使用上述 .pro 配置和条件指令时缺少库一样,即使库可用且已链接:
#ifdef _WINSCARD_H_
// code that needs to be compiled only when library is present and linked.
#endif
唯一的变化是引入了#ifdef _WINSCARD_H_
.
最佳答案
可以根据文件是否存在在 qmake 中生成条件构建。
您可以在 .pro
文件中添加类似的内容
exists( C:/Program Files/Windows Kits/8.0/Lib/win8/um/x86/winscard* ) {
message( "Configuring for winscard..." )
INCLUDEPATH += "C:/Program Files/Windows Kits/8.0/Include/um"
LIBS += -L"C:/Program Files/Windows Kits/8.0/Lib/win8/um/x86" -l"winscard"
DEFINES += _WINSCARD_H_
}
内置函数exists()
之后的 block 只有在找到路径时才会被解析(可以使用星号来匹配部分文件名)。此处 _WINSCARD_H_
仅在找到所需文件时才定义。
因此,该宏可以在源代码中用于条件编译。
参见 qmake Test Functions Reference了解详情。
关于c++ - Qt - 使用预处理器指令检查 Windows 上链接的 .lib 的可用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32772004/