Сборка CMake для Windows (clang-cl) с использованием Ninja Generator - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь создать простое приложение на компьютере с Windows, используя CMake в качестве основного инструмента сборки.После запуска CMake в проекте возникает ошибка на этапе настройки:

> cmake -H. -G Ninja -Bbuild -DCMAKE_C_COMPILER:PATH="C:\Program Files\LLVM\bin\clang-cl.exe" -DCMAKE_CXX_COMPILER:PATH="C:\Program Files\LLVM\bin\clang-cl.exe"

-- The C compiler identification is Clang 7.0.0
-- The CXX compiler identification is Clang 7.0.0
-- Check for working C compiler: C:/Program Files/LLVM/bin/clang-cl.exe
-- Check for working C compiler: C:/Program Files/LLVM/bin/clang-cl.exe --broken
CMake Error at C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeTestCCompile
r.cmake:52 (message):
  The C compiler

    "C:/Program Files/LLVM/bin/clang-cl.exe"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: C:/Users/mak/Desktop/cmake-test/build/CMakeFiles/CMakeTmp

    Run Build Command:"C:/Qt/Tools/QtCreator/bin/ninja.exe" "cmTC_f5485"
    [1/2] Building C object CMakeFiles\cmTC_f5485.dir\testCCompiler.c.obj
    [2/2] Linking C executable cmTC_f5485.exe
    FAILED: cmTC_f5485.exe
    cmd.exe /C "cd . && "C:\Program Files\CMake\bin\cmake.exe" -E vs_link_exe --intdir=CMakeFiles\cmTC_f5485.dir --manifests  -- CMAKE_LINKER-NOTFOUND  /nologo CMakeFiles\cmTC_f5485.dir\testCCompiler.c.obj  /out:cmTC_f5485.exe /implib:cmTC_f5485.lib /pdb:cmTC_f5485.pdb /version:0.0  /machine:x64  /debug /INCREMENTAL /subsystem:console  kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
    RC Pass 1: command "rc /foCMakeFiles\cmTC_f5485.dir/manifest.res CMakeFiles\cmTC_f5485.dir/manifest.rc" failed (exit code 0) with the following output:
    The system cannot find the given file
    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)

Я много читаю в Интернете, но моя проблема не была решена ни одним из предложенных решений.До сих пор я обнаружил, что это схожее, но, возможно, устаревшее решение той же проблемы, которая не работала для меня, потому что ниндзя не смог собрать исполняемый файл:

> ninja all
[1/2] Building CXX object CMakeFiles/minimal.dir/main.cpp.obj
FAILED: CMakeFiles/minimal.dir/main.cpp.obj
C:\PROGRA~1\LLVM\bin\clang-cl.exe     -MD -MT CMakeFiles/minimal.dir/main.cpp.obj -MF CMakeFiles\minimal.dir\main.cpp.obj.d -o CMakeFiles/minimal.dir/main.cpp.obj -c ../main.cpp
clang-cl.exe: warning: unknown argument ignored in clang-cl: '-MF' [-Wunknown-argument]
clang-cl.exe: error: no such file or directory: 'CMakeFiles/minimal.dir/main.cpp.obj'
clang-cl.exe: error: no such file or directory: 'CMakeFiles\minimal.dir\main.cpp.obj.d'
ninja: build stopped: subcommand failed.

До этогоошибка CMake настроена правильно, за исключением того, что не удалось обнаружить информацию ABI всех компиляторов, но CMake возобновил работу без ошибок.Есть некоторые другие вопросы, которые также не помогли.

Официальная документация утверждает, что это довольно просто, но на самом деле этоnot.

Итак: Как мне построить простой C ++ проект, используя CMake с генератором Ninja и Clang в качестве компилятора?Я стараюсь избегать установки Visual Studio, но было бы замечательно, если бы сгенерированные двоичные файлы были совместимы с двоичными файлами сборки MSVC.

Версии:

  • CMake 3.12.2
  • ниндзя 1.8.2
  • Clang 7.0.0

Пример: Вот мини-пример, над которым я работаюс:

CMakeLists.txt

cmake_minimum_required(VERSION 3.12)
project(minimal)
add_executable(${PROJECT_NAME} main.cpp)

main.cpp

#include <stdio.h>

int main(void)
{
  printf("Hello World!\n");
  return 0;
}

1 Ответ

0 голосов
/ 14 ноября 2018

Для компиляции с clang-cl необходимо запустить cmake с загруженной средой MSVC (используйте vcvarsall.bat ).В противном случае он пытается использовать параметры совместимости GCC.Для этого достаточно установить только Build Tools .

...