Сборка CMake для Windows (clang-cl) с использованием Ninja Generator

Я пытаюсь создать простое приложение на машине с 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 не смог построить исполняемый файл:

> 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 возобновил работу без ошибок. Есть некоторые другие вопросы, которые тоже не помогли.

В официальной документации говорится, что это довольно просто, но на самом деле это не так.

Итак: Как мне создать простой 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;
}

person maxik    schedule 11.10.2018    source источник
comment
Предполагая, что Das System kann die angegebene Datei nicht finden представляет собой нечто вроде «Система не может найти указанный путь», ошибка связана с пропущенной rc служебной программой. Кроме того, CMAKE_LINKER-NOTFOUND означает, что CMake не удалось обнаружить компоновщик.   -  person Tsyvarev    schedule 11.10.2018
comment
Вы совершенно правы. (Извините за отсутствие этого перевода.) Я предоставил оба, CMAKE_LINKER и CMAKE_RC_COMPILER, помимо всех других определений, но это тоже не сработало. Результат почти такой же.   -  person maxik    schedule 11.10.2018
comment
Не могли бы вы подтвердить, что настраиваете проект из терминала командной строки Visual Studio?   -  person J-Christophe    schedule 11.10.2018
comment
Я не использую и не собираюсь использовать какие-либо инструменты Visual Studio. Перечитывая документацию, можно прийти к выводу, что это своего рода требование. Вы можете это подтвердить? Часть, использующая генератор Ninja, не говорит об этом прямо.   -  person maxik    schedule 12.10.2018
comment
@Tsyvarev Я заметил, что при ручной установке CMAKE_LINKER эта переменная устанавливается в CMAKE_LINKER-NOTFOUND, как только я запускаю конфигурацию (что из-за этого терпит неудачу). Как правильно установить линкер?   -  person maxik    schedule 16.10.2018
comment
Сам CMake не имеет конкретной переменной для установки компоновщика, вам нужно определить все правило связывания (CMAKE_ ‹LANG› _LINK_EXECUTABLE для исполняемого файла, CMAKE_<LANG>_CREATE_SHARED_LIBRARY для общей библиотеки, CMAKE_<LANG>_CREATE_SHARED_MODULE для библиотеки модулей). Может быть, некоторые скрипты обнаружения компилятора намекают на компоновщик, но я не знаю об этом. Собственно, сейчас я не уверен, что CMAKE_LINKER-NOTFOUND сигнализирует о проблеме.   -  person Tsyvarev    schedule 16.10.2018


Ответы (1)


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

person lav    schedule 14.11.2018