在Windows上使用CMake,Ninja和Clang构建

Sim*_*mon 18 windows cmake clang ninja

亲爱的C++编程员,

在使用Visual Studio工具链在Windows上构建一段时间后,我决定给Clang 5一个镜头.

我安装了LLVM 5.0.0二进制文件,Ninja构建环境,VS 2017工具和CMake 3.9.3.最终目标是能够使用VS Code编译C和C++应用程序,将CMake集成为"IDE",将Clang与LLD一起编译为编译器和链接器.

一个简单程序的编译和执行工作得非常好(相应终端历史的屏幕截图).Clang在VS Tools目录中自动检测到Windows的标准lib,并生成了可执行输出.

下一步是使用Ninja建立一个简单的构建(ninja.build文件和终端历史的截图).构建过程按预期工作,并像以前一样生成可运行的可执行文件.

当我开始将CMake集成到流程中时,问题就开始了.我的期望是CMake生成一个ninja构建文件并运行它,对吗?我尝试了以下CMakeLists文件

cmake_minimum_required(VERSION 3.9)

project(Test)

add_executable(Test main.c)
Run Code Online (Sandbox Code Playgroud)

并称为CMake cmake -G Ninja.由此产生的结果是令人失望的,我不明白,分别自己解决问题.

-- The C compiler identification is Clang 5.0.0
-- The CXX compiler identification is Clang 5.0.0
-- Check for working C compiler: C:/Meine_Programme/LLVM/bin/clang.exe
-- Check for working C compiler: C:/Meine_Programme/LLVM/bin/clang.exe -- broken
CMake Error at C:/Meine_Programme/CMake/share/cmake-3.9/Modules/CMakeTestCCompiler.cmake:51 (message):
  The C compiler "C:/Meine_Programme/LLVM/bin/clang.exe" is not able to
  compile a simple test program.

  It fails with the following output:

   Change Dir: D:/Dateien/Downloads/Test/CMakeFiles/CMakeTmp



  Run Build Command:"C:/Meine_Programme/Ninja_Build/ninja.exe" "cmTC_eeb5c"

  [1/2] Building C object CMakeFiles\cmTC_eeb5c.dir\testCCompiler.c.obj

  FAILED: CMakeFiles/cmTC_eeb5c.dir/testCCompiler.c.obj 

  C:\Meine_Programme\LLVM\bin\clang.exe /nologo /DWIN32 /D_WINDOWS /W3 /MDd
  /Zi /Ob0 /Od /RTC1 /showIncludes
  /FoCMakeFiles\cmTC_eeb5c.dir\testCCompiler.c.obj
  /FdCMakeFiles\cmTC_eeb5c.dir\ -c testCCompiler.c

  clang.exe: error: no such file or directory: '/nologo'

  clang.exe: error: no such file or directory: '/DWIN32'

  clang.exe: error: no such file or directory: '/D_WINDOWS'

  clang.exe: error: no such file or directory: '/W3'

  clang.exe: error: no such file or directory: '/MDd'

  clang.exe: error: no such file or directory: '/Zi'

  clang.exe: error: no such file or directory: '/Ob0'

  clang.exe: error: no such file or directory: '/Od'

  clang.exe: error: no such file or directory: '/RTC1'

  clang.exe: error: no such file or directory: '/showIncludes'

  clang.exe: error: no such file or directory:
  '/FoCMakeFiles\cmTC_eeb5c.dir\testCCompiler.c.obj'

  clang.exe: error: no such file or directory:
  '/FdCMakeFiles\cmTC_eeb5c.dir\'

  ninja: build stopped: subcommand failed.





  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:3 (project)


-- Configuring incomplete, errors occurred!
See also "D:/Dateien/Downloads/Test/CMakeFiles/CMakeOutput.log".
See also "D:/Dateien/Downloads/Test/CMakeFiles/CMakeError.log".
Run Code Online (Sandbox Code Playgroud)

我猜这个问题与CMake调用使用斜杠的VS风格选项而不是前面的减号相关,就像clang要求一样.

谢谢你们帮助我们,我很感激:-)

如果您需要更多信息,请给我留言.

回答Florians的帖子

我尝试了Florians命令,但省略了忍者的路径以获得更短的符号,结果证明工作得很好.

cmake -E env LDFLAGS="-fuse-ld=lld"  cmake -H. -G Ninja -Bbuild -DCMAKE_C_COMPILER:PATH="C:\MeineProgramme\LLVM\bin\clang.exe" -DCMAKE_CXX_COMPILER:PATH="C:\MeineProgramme\LLVM\bin\clang++.exe" -DCMAKE_C_COMPILER_ID="Clang" -DCMAKE_CXX_COMPILER_ID="Clang" -DCMAKE_SYSTEM_NAME="Generic"
Run Code Online (Sandbox Code Playgroud)

CMake制作了一个忍者构建文件.

我跑来ninja all构建可执行文件Test.我将其重命名为Test.exe,程序执行愉快.到目前为止......成功!!! 但比我想象的要复杂得多.

Flo*_*ian 11

受@Unspongeful的"在Windows上用Clang编译的方法"的启发,经过一些扩展测试,以下命令行为我工作(是的,这是一个很大的命令,我只是分成几行以提高可读性):

> cmake -E env LDFLAGS="-fuse-ld=lld-link" PATH="<path\to\ninja>" 
      cmake -H. -G Ninja -Bbuild 
         -DCMAKE_C_COMPILER:PATH="%ProgramFiles(x86)%\LLVM\bin\clang.exe" 
         -DCMAKE_CXX_COMPILER:PATH="%ProgramFiles(x86)%\LLVM\bin\clang.exe" 
         -DCMAKE_C_COMPILER_ID="Clang" 
         -DCMAKE_CXX_COMPILER_ID="Clang" 
         -DCMAKE_SYSTEM_NAME="Generic"
Run Code Online (Sandbox Code Playgroud)

以下是一些背景信息:

目前看来你必须绕过很多CMake的自动检查才能让它正常工作.因此,可能请咨询CMake团队或提出问题,以便正式支持此方案.

Generic系统的最后一部分可能不是最佳选择,因为它会跳过Windows 后面的特定设置.exe.

但它是唯一真正起作用的星座:

-- The C compiler identification is Clang
-- The CXX compiler identification is Clang
-- Check for working C compiler: C:/Program Files (x86)/LLVM/bin/clang.exe
-- Check for working C compiler: C:/Program Files (x86)/LLVM/bin/clang.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/Program Files (x86)/LLVM/bin/clang.exe
-- Check for working CXX compiler: C:/Program Files (x86)/LLVM/bin/clang.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: build
Run Code Online (Sandbox Code Playgroud)


Sim*_*mon 7

我终于找到了一种让我满意的方式来使用我喜欢的工具。它并不完美,但它比 Florians 方法更好地将系统名称设置为Generic(我已经使用了一段时间了)

我首先设置 VS Code 以使用 VS 开发人员终端作为其标准终端。我通过将以下行添加到 VS Code 首选项来做到这一点

"terminal.integrated.shell.windows": "C:\\MeineProgramme\\Visual_Studio\\2017\\BuildTools\\Common7\\Tools\\LaunchDevCmd.bat"
Run Code Online (Sandbox Code Playgroud)

在 VS Code 中启动终端后,我需要调用相应的批处理文件来设置所需的环境变量(在我的情况下vcvars64.bat)。这些可以在

C:\MeineProgramme\Visual_Studio\2017\BuildTools\VC\Auxiliary\Build
Run Code Online (Sandbox Code Playgroud)

导航到我的构建目录后,我使用以下选项运行 CMake

cmake .. -G Ninja -DCMAKE_CXX_COMPILER:PATH="C:\MeineProgramme\LLVM\bin\clang-cl.exe" -DCMAKE_LINKER:PATH="C:\MeineProgramme\LLVM\bin\lld-link.exe"
Run Code Online (Sandbox Code Playgroud)

这鼓励 CMake 使用我安装的所有 LLVM 工具。不仅clanglld(确保使用支持由 a 引导的选项的 lld-link /),而且还有llvm-arllvm-ranlib。唯一使用的 MS 构建工具是我目前不使用的资源编译器。

到目前为止,我认为是成功的。

如果您有其他问题,请随时与我联系或在下面发表评论。