如何告诉 CMake 在 Windows 上使用 Clang?

2024-01-10

我有一个使用 CMake 构建的 C++ 项目。我通常在 OSX 上构建,但现在我正在尝试让 Windows 版本也能工作。出于兼容性原因,我想在 Windows 上使用 Clang。

我从 LLVM 安装了预编译的 Clang 3.8 二进制文件:

C:\Program Files\LLVM\bin\clang.exe
C:\Program Files\LLVM\bin\clang++.exe

它也安装在我的路径上:

>clang++
clang++.exe: error: no input files

我有两个问题:

  1. 我如何告诉 CMake 使用clang++当我打电话时cmake --build?
  2. 在构建之前如何检查 CMake 配置了哪个编译器?

除了 Clang 编译器本身之外,您还需要 Windows 的构建/链接环境。

最新的 CMake 3.6 构建确实在 Windows 上有几个集成的受支持的 Clang 构建环境(例如 Visual Studio、Cygwin;请参阅发行说明 https://cmake.org/cmake/help/v3.6/release/3.6.html).

我刚刚成功进行了测试

  • LLVM-3.9.0-r273898-win32.exe http://llvm.org/pre-releases/win-snapshots/LLVM-3.9.0-r273898-win32.exe from http://llvm.org/builds/ http://llvm.org/builds/
  • cmake-3.6.0-rc4-win64-x64.msi https://cmake.org/files/v3.6/cmake-3.6.0-rc4-win64-x64.msi from https://cmake.org/download/ https://cmake.org/download/
  • 微软VS2015社区版版本14.0.23107.0

全部安装到其标准路径bin全局目录PATH环境。

您需要了解的部分是使用 CMake 设置正确的工具集-T"LLVM-vs2014"命令行选项。在配置过程中,CMake 会让您知道它找到/采用的是哪个编译器。

CMakeLists.txt

cmake_minimum_required(VERSION 3.6)

project(HelloWorld)

file(
    WRITE main.cpp 
        "#include <iostream>\n"
        "int main() { std::cout << \"Hello World!\" << std::endl; return 0; }"
)
add_executable(${PROJECT_NAME} main.cpp)

Windows 控制台

...> mkdir VS2015
...> cd VS2015
...\VS2015> cmake -G"Visual Studio 14 2015" -T"LLVM-vs2014" ..
-- The C compiler identification is Clang 3.9.0
-- The CXX compiler identification is Clang 3.9.0
-- Check for working C compiler: C:/Program Files (x86)/LLVM/msbuild-bin/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/LLVM/msbuild-bin/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/LLVM/msbuild-bin/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/LLVM/msbuild-bin/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: .../VS2015
...\VS2015> cmake --build . 
Microsoft (R)-Buildmodul, Version 14.0.23107.0
[...]
...\VS2015> Debug\HelloWorld.exe
Hello World!

安装提示

请注意,我在设置过程中已将 LLVM 添加到我的搜索路径中:

您可以在任何 VS 项目的属性页中交叉检查可用的“平台工具集”:

参考

  • 告诉 Cmake 在哪里找到 nmake 的 -D 定义是什么? https://stackoverflow.com/questions/38106848/what-is-the-d-define-to-tell-cmake-where-to-find-nmake
  • Clang 的链接器? https://stackoverflow.com/questions/3925409/linker-for-clang
  • 使用 CMake 在 GCC 和 Clang/LLVM 之间切换 https://stackoverflow.com/questions/7031126/switching-between-gcc-and-clang-llvm-using-cmake
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何告诉 CMake 在 Windows 上使用 Clang? 的相关文章

随机推荐

  • 如何使用 Xcode 4.3 或应用程序加载器将应用程序提交到 App Store

    我的第一个 iOS 应用程序在 iTunes Connect 中处于 等待上传 状态 但由于应用程序加载器中的 Xcode 4 3 遇到问题 我无法将其提交到 App Store 在 Xcode 4 3 中我有 3 个配置文件 临时配置文件
  • 右表中结果为空的内连接

    我有2张桌子 餐厅和订单 每个餐厅可以有很多订单 restaurants table id name orders table id restaurant id date 我需要找到在某个日期范围内没有订单的餐厅 在订单表中 我保存订单日期
  • 变量切换方向丢失

    我是安卓新手 我编写了几个程序并在手机上试用了它们 当我切换方向时 就像我的手机重新启动程序一样 我所有的变量都被重置 事实上 唯一没有重置的是编辑文本视图中的文本 这是什么原因造成的 我怎样才能阻止它 我尝试在谷歌和堆栈溢出上查看它 但我
  • CSS calc 在 Safari 和后备中不起作用

    我正在研究这个布局 它强烈依赖 CSS calc 来进行必要的计算 width webkit calc 50 20px width moz calc 50 20px width calc 50 20px 现在 我无法让它在 Safari 中
  • NHibernate、代理和平等

    我正在使用 NHibernate 3 3 1 并发现非常有趣的问题 在我的域模型中 我定义了两个类 Carriage 和 CarriageRequest 相互引用 因为延迟加载已打开 所以当我访问carriage CarriageReque
  • 在 .NET Core 中自动创建私钥、CSR 和最终签名证书的过程

    有人向我提供了中间证书 由根证书签名 及其密码 为了安全地连接到 SSL 端点 我需要提供签名证书 这是我所做的 创建私钥 使用该私钥创建 CSR 使用提供的中级证书对其进行签名 我使用 openssl 来完成这一切 它运行得非常完美 TL
  • 服务中的断点不起作用

    我正在尝试向在单独线程上运行的服务添加断点 无论我将断点放置在服务中的哪个位置 它们总是被忽略 我确信该服务正在运行 正如我所看到的Log e在日志猫中 我的调试模式也可以正确使用 因为应用程序主线程中的任何断点都可以工作 我错过了什么吗
  • 从 Django 内部调用时,Subprocess.Popen 与交互式程序一起挂起

    我编写了一个小型 Django 应用程序 它根据用户输入执行交互式程序并将输出作为结果返回 但由于某种原因 子进程挂起 在验证日志时 我发现必须给出 n 作为对挑战的响应的地方 该响应似乎从未做出过 有趣的是 如果我从 Django 外部运
  • Hibernate 锁定模式/锁定选项

    我正在浏览 Hibernate 文档并遇到了LockModes 这些是否与Isolation levels我们用于数据库 它们有何不同Isolation levels 我正在尝试一个简单的示例 并观察到当我使用 session load 方
  • 从 makefile 调用 flex

    我想调用 flex 来构建一个 l 文件 然后调用 gcc 来构建所有内容 I tryed comp lex scanner l gcc o a out main c hash c I error lex scanner l gcc o a
  • 如何开始黑莓编程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 编码文件路径

    net 中是否有内置方法可以像编码 url 一样对文件路径进行编码 例如 如果我的文件名中有非法字符 例如 whatever whatever 我希望它对 进行编码 这样它仍然存在 只是进行编码以便系统接受它 我想做类似的事情Path En
  • php,while()循环中的无限循环

    infinite loop x 1 while x 9 echo x x 我不明白背后的原因 为什么上面的代码会导致无限循环 在我看来 上面的代码应该输出 9 一次 但它输出无穷无尽的999999999 首先 当 x 等于 1 时 whil
  • Smack 的 FileTransferManager.createOutgoingFileTransfer 仅接受完整的 JID。如何在 Smack 中确定用户的完整 JID?

    经过几个小时的调试并试图找出为什么使用 aSmack 无法进行文件传输 而正常的消息传递却可以 我终于设法将其确定为这一点 当我按照 Smack 文档中给出的方法获取用户的名册列表时 Openfire 服务器发送的名册 JID 末尾缺少 C
  • 使用当前行值更新变量

    我正在尝试执行一项复杂的操作 其中我提取整列数据的总和 并从每行的总和中减去运行小计 我可以单独完成 Sum 和 Running Subtotal 的组成部分 用它来运行小计 sum UsageMetric over order by Ne
  • IE9、表格和显示:块

    对于我网站的低宽度移动版本 我切换了display某些的table tr td and th to block 让它们垂直堆叠 我使用此技术来允许宽表继续显示其所有内容 而不会溢出其容器之外 它在所有现代 5 种浏览器中都能完美运行 但在
  • 如何在 Android 中以最佳方式调整位图大小?

    假设我有一个六边形 如果我调整它的大小以在包含六边形网格的应用程序中使用它 bgPaint new Paint bgPaint setAntiAlias true bgPaint setDither true Bitmap coloredB
  • iOS - 如何使用 NIB 中的特定框架初始化自定义 UIView

    我想知道初始化自定义的最干净的方法是什么UIView具有特定的框架 The UIView是由一个设计的XIB file 这是我的实现 class CustomView UIView IBOutlet var outletLabel UILa
  • 为 Debian Lenny 编译 OpenCV 2.4.2

    为了保留问答方面 我在最新 v 2 4 2 OpenCV 版本中遇到了一个奇怪的问题 安装失败并出现以下错误 在 OpenCV 2 4 2 modules core src system cpp 460 包含的文件中 OpenCV 2 4
  • 如何告诉 CMake 在 Windows 上使用 Clang?

    我有一个使用 CMake 构建的 C 项目 我通常在 OSX 上构建 但现在我正在尝试让 Windows 版本也能工作 出于兼容性原因 我想在 Windows 上使用 Clang 我从 LLVM 安装了预编译的 Clang 3 8 二进制文