c++ - Qt - 使用预处理器指令检查 Windows 上链接的 .lib 的可用性

标签 c++ windows qt linker c-preprocessor

我正在尝试在 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我绝对可以使用它的功能。当我尝试根据这些条件指令限制编译时,问题就出现了。


使用时代码编译良好

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/

相关文章:

c++单例,堆栈溢出示例不起作用

c++ - 在c中后台运行线程

c++ - 如何从当前运行的进程中释放 SQLServerCE 的 COM 实例?

c++ - mmioOpen 出现奇怪的文件未找到错误

Qt WinRT App 无法访问文件权限被拒绝

c++ - 编写 SQLite 管理器类 : viable approach?

c++ - 数组传递和返回

windows - 为什么有些项目在 Spy++ 的 Windows View 中显示为灰色?

c++ - 获取当前目录,我可以在不知道最大缓冲区大小的情况下进行吗?

c++ - 如何在打开的程序窗口上自动启用信号