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

47

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

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

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

它也被安装在我的PATH路径中:

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

我有两个问题:

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

有一个 toolchain.txt 文件,在文档中查找它。 - πάντα ῥεῖ
在Ubuntu上,当我通过Make调用g++编译器时 (Make中有$(CC)),我使用CC='g++ -m64'。而在调用clang++时,我则使用CC="clang++ -m64"。(我不使用CMake或Windows) - 2785528
使用-DCMAKE_CXX_COMPILER=C:/path/to/clang++有什么问题吗? - usr1234567
1
@usr1234567 这是平台相关的,即不能使用单一、可移植的配方,如 cmake .. && cmake --build .,但除了 Windows 之外。 - K3---rnc
3个回答

45

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

最新的CMake 3.6版本已经支持在Windows上集成多个Clang构建环境(例如Visual Studio、Cygwin;请参见发行说明)。

我刚刚使用以下内容进行了成功测试:

所有内容都按照标准路径安装,并将它们的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添加到我的搜索路径中:

通过Add to PATH 安装 LLVM

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

VS 项目属性 - 平台工具集

参考资料


1
非常混乱。CMake应该考虑将“-G”更改为MSBuild,因为那是它的输出,并添加子选项以设置实际编译器工具链。 - kchoi
1
(几乎)可移植的解决方案,如果不运行LLVM安装程序:在目录tools\msbuild下的所有.props文件中替换字符串<LLVMInstallDir>$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\LLVM\LLVM)</LLVMInstallDir>为字符串<LLVMInstallDir>$(LLVM_ROOT)</LLVMInstallDir>,并确保环境变量LLVM_ROOT指向“便携式”安装目录,例如C:\llvm-3.9.1-x86问题:需要管理员权限才能为MSBuild“安装”LLVM工具集。如果有人知道如何使用存储在默认目录之外的MSBuild工具集,请告诉我。 - Florian Wolters
如果有人在使用CMake-GUI应用程序时遇到困难,只需在工具集(-T参数)的输入字段中传递“LLVM-vs2014”,而不是“-T”LLVM-vs2014“”。 - yau
对于那些使用LLVM安装程序的人来说,一个提示:在安装LLVM之前先安装Visual Studio。LLVM安装程序仅安装已安装Visual Studio版本的工具集(出于显而易见的原因)。否则,在安装新版本的Visual Studio之后重新安装LLVM会有所帮助。 - PaulR
未来的读者们,请注意。使用CMake 3.9.1和clang 4.0.1时,CMAKE_C_FLAGS被设置为/DWIN32 -fms-extensions -fms-compatibility -D_WINDOWS -Wall,并且clang-cl会抱怨未知的编译器标志。--但是在提到的cmake版本中它可以正常工作。 - Andreas Duering
显示剩余4条评论

24
作为Visual Studio 2019和2022的更新,您可以通过Visual Studio Installer安装clang-cl工具链,并使用它来生成一个.sln文件:
> mkdir build && cd build
> cmake .. -G "Visual Studio 16 2019" -T ClangCL -A x64

或者

> mkdir build && cd build
> cmake .. -G "Visual Studio 17 2022" -T ClangCL -A x64


然而,更好的工作流程是直接打开包含CMakeLists.txt文件的文件夹,VS会将其识别为CMake项目,并直接提供设置编译器等功能。

唯一的缺点是Visual Studio图形调试器工作流程不适用于此,如果你正在使用DirectX等进行开发,则会受到影响。


谢谢您的指令,只是想通知您现在也可以使用调试器了。 - Alex G. G.
@AlexG.G. Visual Studio 的图形调试器? - trojanfoe
没事,我之前误解了你说的 UI 调试,你是指调试图形界面的工具对吧? - Alex G. G.
2
在 VS 2022 中,我使用 ClangCL 工具集时遇到了 CMake 错误:The CXX compiler identification is unknown CMake Error at CMakeLists.txt:1 (project): No CMAKE_C_COMPILER could be found.。有什么想法吗?我已经通过 VS 安装程序安装了 Clang 工具。 - szx
@szx 我不确定。如果您在VS2022中打开文件夹并调整cmake设置以确保使用正确的编译器,会发生什么? - trojanfoe

12
按照以下步骤操作:
安装choco(如果尚未安装):https://chocolatey.org/install
choco install ninja -y
choco install cmake -y
choco install llvm -y

重置您的shell,以便正确设置环境变量(您可以检查每个bin文件夹是否已添加到您的Path)。

使用Ninja

从PowerShell

$env:CC="C:\Program Files\LLVM\bin\clang.exe"
$env:CXX="C:\Program Files\LLVM\bin\clang++.exe"
cmake -S ./ -B ./build -G "Ninja-Multi-Config"
cmake --build ./build --config Release

从图形用户界面(GUI)

进入您的项目并运行:

cmake-gui .

从上方菜单中选择“工具/配置”,然后按照以下设置进行操作:
选择“Ninja Multi-Config”并指定本地编译器:

ninja

给出编译器的路径: 编译器 最后,运行。
cmake --build ./build --config Release

使用Visual Studio

从PowerShell

cmake -S ./ -B ./build
cmake --build ./build --config Release

从GUI

在某个文件夹中安装llvm-utils:

git clone https://github.com/zufuliu/llvm-utils.git
cd llvm-utils/VS2017
.\install.bat

去你的项目并运行:
cmake-gui .

从上方菜单中选择工具/配置并按照以下设置进行操作:
选择Visual Studio 2019和第二个选项(指定本机编译器)。对于Visual Studio 2019及以上版本,请设置LLVM_v142。其他版本请参考此处的旧版本visual_studio 提供编译器的路径: compilers 最后,运行。
cmake --build ./build --config Release

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接