我们有一套cross-platform CMake build scripts套,我们支持Visual C++GCC的建筑.

我们正在试用Clang,但是我不知道如何测试编译器是否与我们的CMake脚本重合.

我应该测试什么来查看编译器是否发出叮当声?我们现在分别使用MSVCCMAKE_COMPILER_IS_GNU<LANG>来测试Visual C++和GCC.

推荐答案

可靠的判断方法是使用CMAKE_<LANG>_COMPILER_ID个变量.例如,判断C++编译器:

if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  # using Clang
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  # using GCC
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
  # using Intel C++
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
  # using Visual Studio C++
endif()

如果使用ccache这样的编译器包装器,它们也可以正常工作.

截至CMake 3.0.0,苹果提供的Clang的CMAKE_<LANG>_COMPILER_ID值现在是AppleClang.要测试苹果提供的叮当声和常规叮当声,请使用以下条件:

if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  # using regular Clang or AppleClang
endif()

也可以看到AppleClang policy description.

CMake 3.15增加了对clang-cl和常规clang前端的支持.您可以通过判断变量CMAKE_CXX_COMPILER_FRONTEND_VARIANT来确定前端变量:

if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
    # using clang with clang-cl front end
  elseif (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
    # using clang with regular front end
  endif()
endif()

C++相关问答推荐

为什么信号量为空= 0,而不是阻塞?

理解没有返回语句的递归C函数的行为

为什么在C中设置文件的位置并写入文件,填充空字符?

如何正确地索引C中的 struct 指针数组?

如何设置指针指向在函数中初始化的复合文字中的整数?

为什么C语言允许你使用var =(struct NAME){

如果包含路径不存在,我的编译器可以被配置为出错吗?(GCC、MSVC)

在传统操作系统上可以在虚拟0x0写入吗?

具有交换链获取和命令缓冲区提交的同步-危险-读后写错误

如何将常量char*复制到char数组

如何使用[BTStack]BLE发送大型(>;2kb)信息包

C代码在字符串中删除不区分大小写的子字符串的问题

初始成员、公共初始序列、匿名联合和严格别名如何在C中交互?

C程序向服务器发送TCPRST

不兼容的整数到指针转换传递';char';到类型';常量字符*

在我的第一个C语言中观察到的错误';你好世界';程序

一元运算符

GDB 跳过动态加载器代码

使用复合文字数组初始化的指针数组

创建 makefile 来编译位于不同目录中的多个源文件