CMake的MSVC和_MSC_VER一样吗?

时间:2015-10-07 20:15:51

标签: c++ c cmake

我目前正在努力将CMake作为库的依赖项删除,因为看起来大多数生成的代码都可以是静态的。执行一些环境检查以查看我们正在使用的操作系统和编译器类型。 CMake中的其中一项检查如下所示:

if (MSVC)
    set (HAVE_SYS_TYPES_H 1)
    set (HAVE_STDINT_H    1)
    set (HAVE_STDDEF_H    1)
    # snip more things
else ()
    # snip more things
endif ()

可以用以下C代码替换它吗?

#ifdef _MSC_VER
    #define HAVE_SYS_TYPES_H
    #define HAVE_STDINT_H
    #define HAVE_STDDEF_H
    // snip more things
#else
    // snip more things
#endif

我最担心的情况是一样的。我认为他们是,但我还没有找到任何可以证实这一点的内容,而且我目前无法访问正常工作的Windows开发环境来构建它并找到答案。

感谢您提供任何可能的帮助!

1 个答案:

答案 0 :(得分:2)

CMake 3.4 MSVC Documentation

  使用Microsoft Visual C ++时

True

     

当编译器是某个版本的Microsoft Visual C ++时,设置为true

MSDN Predefined Macros Documentation

  

列出预定义的ANSI / ISO C99和Microsoft C ++实现预处理器宏。

     

...

     

特定于Microsoft的预定义宏

     

_MSC_VER 计算整数文字,该文字编码编译器版本号的主要和次要编号组件。 ...

由于使用Microsoft Visual C ++时CMake MSVC为真,并且_MSC_VER是Microsoft特定的C ++宏,因此这些宏可以互换,以确定是否使用Microsoft编译器执行编译。

但是,我不确定#define语句。 CMake set命令只是设置CMake变量知道如何在CMake脚本中使用这些变量

你所拥有的可能是足够的或者可能:

#define HAVE_SYS_TYPES_H 1
#define HAVE_STDINT_H 1
#define HAVE_STDDEF_H 1

CMake add_definitions命令是添加预处理器定义的一种方法。