如何区分 clang 和 clang-cl?

2023-12-25

我是 CMake 的新手,在这里遇到了一些障碍,想知道是否有一个“优雅”的解决方案来解决这个问题,或者也许只是一个简单的解决方案。

例如,为了设置编译器标志,我正在执行以下操作:

target_compile_options(${PROJECT_NAME}
    PUBLIC
        $<$<CXX_COMPILER_ID:GNU>:"-some_gnu_flag">
        $<$<CXX_COMPILER_ID:Clang>:"-some_clang_flag">
        $<$<CXX_COMPILER_ID:MSVC>:"/some_msvc_flag">
)

这完全符合预期,除了当我尝试使用 clang-cl 作为编译器进行构建时,即:

cmake .. -G "Visual Studio 15 2017 Win64" -T "LLVM-vs2014"

CXX ID 报告为 Clang (it is毕竟 clang)但我不想使用 Clang 标志,我实际上想使用 MSVC 标志,因为 clang-cl 被设计为替代 MSVC cl - 因此只接受 MSVC 样式标志。

那么,有哪些好的解决方案可以解决这个问题,而又不会创建一些混乱的代码呢?我知道我可能可以做一堆 if() 检查并设置一些变量,但我试图坚持“现代 cmake”约定,这就是为什么我一开始就使用生成器表达式。


这是我当前的“解决方案”。我找到了 CMAKE_CXX_SIMULATE_ID 变量,它保存了我想要的信息 - 尽管这对我来说仍然感觉有点脏。

# Get compiler info
set(CXX_FLAGS_STYLE_GNU OFF)
set(CXX_FLAGS_STYLE_MSVC OFF)
set(CXX_FLAGS_STYLE_CLANGCL OFF)
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
    set(CXX_FLAGS_STYLE_GNU ON)
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    if ("${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
        set(CXX_FLAGS_STYLE_CLANGCL ON)
    else ()
        set(CXX_FLAGS_STYLE_GNU ON)
    endif ()
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
    set(CXX_FLAGS_STYLE_MSVC ON)
else ()
    message(FATAL_ERROR "Unsupported compiler!")
endif ()

# Compiler flags
target_compile_options(${PROJECT_NAME}
    PRIVATE
        ## GCC/Clang Flags
        $<$<BOOL:${CXX_FLAGS_STYLE_GNU}>:"-someflag">
        ## MSVC flags
        $<$<BOOL:${CXX_FLAGS_STYLE_MSVC}>:"/someflag">
        ## CLANG-CL flags
        $<$<BOOL:${CXX_FLAGS_STYLE_CLANGCL}>:"-someflag">
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何区分 clang 和 clang-cl? 的相关文章

  • CMake:将为 lib 构建的对象文件重用到另一个 lib 目标中

    我正在尝试将我的项目转移到CMake 同时对编译过程进行一些优化 这是交易 我有几个子目录 必须 每个子目录都编译成静态库 这有效 我想将每个子目录中的所有目标文件收集到另一个更大的 完整的静态库中 它看起来像这样 libBig a mad
  • clang-tidy - 忽略第三方标头代码

    我正在为我的项目使用 CMake 并且我想向项目引入 clang tidy 检查 我用于此目的CMAKE CXX CLANG TIDY and clang tidy用于检查设置的文件 我想在 CI 中使用警告作为错误来可靠地检查提交是否引入
  • 如何在 Windows 中使用 cmake 构建和链接 google benchmark

    我正在尝试构建 google benchmark 并使用 cmake 将其与我的库一起使用 我已经成功构建了 google benchmark 并使用 cmake 成功运行了所有测试 不幸的是 我无法使用 cmake 或 cl 将其与 Wi
  • 如何让 CMake 为目标安装 PDB 文件

    如何让 CMake 安装调试 Visual Studio 生成的 DLL 文件和 EXE 文件所需的配套 PDB 文件 我已经挣扎了一段时间 试图找到这个问题的一个好的答案 我现在认为我找到了一个 使用安装文件命令
  • CMake:如何将 .def 文件添加到 Visual Studio 项目过滤器?

    如何将 def 文件添加到 Visual Studio 项目过滤器 filters文件 Visual Studio 使用 def 文件 CMake代码 set a src a cpp a def add library a SHARED a
  • cmake 不会在更改时重建 externalProject

    我有以下 CMakeLists txt cmake minimum required VERSION 3 0 project addProject include ExternalProject set ExternalProjectCMa
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https
  • CMake“项目”指令的正确用法是什么

    我有一个很大的代码库 它构建了几十个库和几个可执行文件 代码库按层次结构进行分解 并且几乎在每个级别都构建了库 我已经仔细检查并在每个目录中放置了一个 CMakeLists txt 文件来构建每个库 在每个 CMakeLists txt 中
  • CMake:用于Android交叉编译的FIND_PACKAGE(Threads)

    我正在使用 Android NDK 和 Cmake 生成项目的共享库 我正在将现有项目从 Ubuntu 移植到 Android 现在我需要移植一些可执行文件 我成功编译了所有需要的可执行文件Threads图书馆 在CMakeList txt
  • CMake:如何最好地构建多个(可选)子项目?

    想象一个包含多个组件的整体项目 basic io web app a app b app c 现在 假设 web 依赖于 io 而 io 又依赖于 basic 所有这些东西都在一个存储库中 并且有一个 CMakeLists txt 将它们构
  • Python pip install pyarrow错误,无法执行'cmake'

    我尝试在 EMR 集群的主实例上安装 pyarrow 但总是收到此错误 hadoop ip XXX XXX XXX XXX sudo usr bin pip 3 4 install pyarrow Collecting pyarrow Do
  • Haskell 项目可以使用 cmake 吗?

    我正在计划一个用 Haskell 编写的项目 也许也有一些部分是用 C 编写的 对于构建系统 我决定不选择 Haskell 程序 cabal 的常见选择 主要是因为我想了解其他语言的构建程序是如何工作的 我听说过 CMake 我认为这是一个
  • 为 CMake 中的子目录生成“干净”目标

    我想生成一个clean子目录的目标 我的项目结构是这样的 app A B lib A B C 有时我只想在 app A 上运行干净 并且不想清理库 是否可以告诉 CMake 生成clean每个目录的目标 或者像这样的自定义目标应用程序清理哪
  • 在 MAC OSX 上使用 CMake 生成 .bundle 文件

    我想生成一个可执行文件 bundle文件于Mac OSX 10 6 8 using CMake 我的 CMakeLists txt 文件如下所示 cmake minimum required VERSION 2 8 PROJECT TEST
  • 在 C 中使用 pow 时,CMake 可以检测是否需要链接到 libm 吗?

    对于某些编译器 using powC 程序中的某些其他函数需要链接到m library https stackoverflow com q 8671366 1959975 但是 某些编译器不需要这样做 并且在链接到m图书馆 C 也存在几乎相
  • 如何判断给定目标是库还是可执行文件?

    内置功能install TARGETS 将库目标安装到可执行目标之外的其他位置 我想做类似的事情 给定目标名称列表 我想将其中的所有库目标添加到列表变量中 并将所有运行时目标添加到另一个变量中 我找不到 CMake 的默认目标属性列表 但我
  • 在cmake中集成bash测试脚本

    我有一个 C cmake 项目 它使用 Boost Test 进行单元测试 现在我想向 cmake 公开一系列 bash 脚本 用于集成测试 假设每个脚本在以下情况下返回 0PASS或某些情况下 0FAILURE 我希望每次运行时都执行每个
  • CMake 创建可执行文件时未定义的引用

    我是 CMake 新手 我正在尝试编译我的项目 该项目创建了一些静态库和一些可执行文件 下面是我拥有的文件结构的示例 PROJECT SRC 子项目 1该文件夹的 cpp 所有源文件 和CMakeLists txt 1 创建静态库 子项目

随机推荐

  • `alias sudo="sudo "` 是如何工作的?

    研究将当前用户的别名传递给sudo命令 我发现以下内容在 ArchWiki 上 https wiki archlinux org index php Sudo Passing aliases 传递别名 如果您使用很多别名 您可能会注意到它们
  • AS3 按住按钮时连续运行代码 - Air 适用于 iOS/Android

    我正在 Flash CS6 中开发 iOS 游戏 我有一个基本的运动测试Event MOUSE DOWN处理程序 我期望 想要的是 当我将手指按住按钮时 玩家会继续移动 直到我停止触摸屏幕 但发生的情况是 我必须不断地点击才能让玩家保持移动
  • rdtsc乱序执行的解决方案?

    我正在尝试用 rdtsc 替换 clock gettime CLOCK REALTIME ts 来根据 CPU 周期而不是服务器时间来基准代码执行时间 基准测试代码的执行时间对于软件至关重要 我尝试在独立核心上的 x86 64 3 20GH
  • Google Maps API 在距离起点特定距离的路线上显示图标

    我想在谷歌地图上显示虚拟进度 我想显示带有路线的地图 并且在该路线上我想从一开始就在一定距离处显示一个图标 将根据数据计算 该距离可能随时或每天发生变化 具体取决于与沿虚拟路线的进度相关的数据 例如 在从洛杉矶到纽约的路线上 有一天我可能想
  • 从 WinForms 应用程序检测 IE 版本

    是否可以从 WinForms 应用程序检测计算机上安装的 IE 版本 EDIT 1 我特别感兴趣的是确定是否安装了 IE9 可以安装多个 IE 版本 但 IE9 特别导致我的应用程序出现问题 怎么样 string ver new WebBr
  • 从旧的 LFS 存储库迁移到新的 LFS 存储库?

    Bitbucket 服务器上托管有 LFS git 存储库 现在我们需要创建新的 LFS 存储库并将存储库移至具有 LFS 存储的位置 这个怎么做 例如对于普通的回购我们可以这样做 git remote add new NEW REMOTE
  • python 中被覆盖的变量会发生什么?

    我正在编写一些 python 代码来处理大量数据 近 600 万条 在代码中 我使用一个巨大的 for 循环来处理每组 在该循环中 我在每个循环中使用相同的变量并覆盖它们 当我运行该程序时 我注意到运行时间越长 速度就越慢 此外 经过进一步
  • HTML5 Canvas 100% 高度和宽度

    我试图让这个雨滴画布脚本占据 100 的宽度和高度 但我似乎没有做任何事情 我尝试更改 CSS 以及 Canvas 区域的高度 宽度 但它要么没有改变任何内容 要么使它根本不起作用 有一次我尝试了一些实际上使其成为全尺寸的东西 它似乎对雨滴
  • 非托管内存泄漏

    我正在使用一个使用 BitmapSource 的 WPF 应用程序 但我需要进行一些操作 但我需要对 System Drawing Bitmaps 进行一些操作 应用程序运行时的内存使用量会增加 我已将内存泄漏范围缩小到以下代码 priva
  • 如何在不使用 javascript 的情况下使用 css 混合内容相关和百分比高度/宽度 [重复]

    这个问题在这里已经有答案了 我想实现这样的布局 header height is its content dependant its height is not set it is as heigh as its content stret
  • PHP简单的html DOM从html标签中删除所有属性

    html file get html page php foreach html gt find p as tag name attr substr tag name gt outertext 2 strpos tag name gt ou
  • 使用 Comparator 而不是 equals() 比较两个 Java 集合

    问题陈述 我有两个要比较的相同类型对象的集合 在这种情况下 我想根据不考虑的属性来比较它们equals 对于对象 在我的示例中 我使用排名的名称集合 例如 public class Name private String name priv
  • 如何在定义为“any”的第三方 TypeScript 接口中扩充属性?

    给定一个如下定义的第三方 TypeScript 模块 in node modules third party module index d ts declare module ThirdPartyModule export interfac
  • javax.faces.FacesException:加载 JSF 页面时解码资源数据时出错

    我在加载 JSF 页面时收到下面提到的错误 页面已成功加载 页面上所需的操作也已完成 但出现此错误 jsf 页面包含选项卡面板 单击每个选项卡面板时都会出现错误 我还发现 如果我将页面的某个部分保留为 render false 则不会出现错
  • Android LinearLayout 上的 onTouchListener

    我有一个线性布局 其中很少有子组件 我在线性布局上有 onTouchListener 我也希望在触摸线性布局的子组件时触发 onTouch 事件 您应该能够实施onInterceptTouch事件 http developer androi
  • Gitlab-runner + Docker + Windows - 无效的卷规范

    在提交之前 我尝试使用 Gitlab runner 和 docker 在本地运行我的 Gitlab CI 以确保它们工作正常 但我遇到了一些奇怪的问题 不幸的是我别无选择 只能使用Windows 我过去在Linux上取得了成功 每次我在 p
  • Lift-json 将带有“type”字段的 json 提取到案例类中

    我正在尝试使用 lift json 将 JSON 提取到案例类中 这是我的案例类 case class Person name String age Int 这是 json name Some Name age 24 type Studen
  • 如何使用 Expression Blend 编辑在 Visual Studio 中创建的 DataTemplate?

    For 使用 Expression Blend 的人以及您实际项目中的Visual Studio 请帮助我理解如何在日常开发 设计任务中使用 Blend 和 Visual Studio 这是一个真实的场景 我在 Visual Studio
  • 如何使用 lapply 在 R 中批量处理 geoTIFF

    我有一些大的 geoTIFF 现在我想将它们转换为 ASCII 文件 经过一些搜索后 我编写了这些代码 library raster f lt list files inputFolder pattern tif full names TR
  • 如何区分 clang 和 clang-cl?

    我是 CMake 的新手 在这里遇到了一些障碍 想知道是否有一个 优雅 的解决方案来解决这个问题 或者也许只是一个简单的解决方案 例如 为了设置编译器标志 我正在执行以下操作 target compile options PROJECT N