Сборка проекта c ++ в Windows с помощью CMake, Clang и Ninja

В настоящее время у меня на окнах установлены cmake, clang и ninja. Я пытаюсь использовать CMake для создания файла сборки ниндзя для компиляции очень простой программы hello world.

Мой CMakeLists.txt выглядит так:

cmake_minimum_required(VERSION 2.8)
project(test_project)
add_executable(main main.cpp)

main.cpp - это простая программа Hello World.

В командной строке я запускаю это: cmake -G Ninja .. и получаю следующие ошибки:

-- The C compiler identification is Clang 3.5.0
clang.exe: error: no such file or directory: '/nologo'
clang.exe: error: no such file or directory: '/showIncludes'
-- The CXX compiler identification is Clang 3.5.0
clang.exe: error: no such file or directory: '/nologo'
clang.exe: error: no such file or directory: '/showIncludes'
-- Check for working C compiler using: Ninja
-- Check for working C compiler using: Ninja -- broken
CMake Error at C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:61 (message):
  The C compiler "C:/llvm_build/RelWithDebInfo/bin/clang.exe" is
  not able to compile a simple test program.

  It fails with the following output:

   Change Dir: C:/test_proj/build/CMakeFiles/CMakeTmp



  Run Build Command:C:/ninja/ninja.exe cmTryCompileExec375034429

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


  [2/2] Linking C executable cmTryCompileExec375034429.exe


  FAILED: cmd.exe /c cd .  &&
  C:\llvm_build\RelWithDebInfo\bin\clang.exe
  CMakeFiles\cmTryCompileExec375034429.dir\testCCompiler.c.obj -o
  cmTryCompileExec375034429.exe && cd .


  clang.exe: error: unable to execute command: program not executable



  clang.exe: error: linker command failed with exit code 1 (use -v to see
  invocation)



  ninja: build stopped: subcommand failed.






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


-- Configuring incomplete, errors occurred!
See also "C:/test_proj/build/CMakeFiles/CMakeOutput.log".
See also "C:/test_proj/build/CMakeFiles/CMakeError.log".

Файл CMakeError.log выглядит так:

Compiling the C compiler identification source file "CMakeCCompilerId.c" failed.
Compiler: C:/llvm_build/RelWithDebInfo/bin/clang.exe 
Build flags: 
Id flags: 

The output was:
1
clang.exe: error: unable to execute command: program not executable
clang.exe: error: linker command failed with exit code 1 (use -v to see invocation)


Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" failed.
Compiler: C:/llvm_build/RelWithDebInfo/bin/clang++.exe 
Build flags: 
Id flags: 

The output was:
1
clang++.exe: error: unable to execute command: program not executable
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)


Determining if the C compiler works failed with the following output:
Change Dir: C:/test_proj/build/CMakeFiles/CMakeTmp

Run Build Command:C:/ninja/ninja.exe cmTryCompileExec2120850158
[1/2] Building C object CMakeFiles\cmTryCompileExec2120850158.dir\testCCompiler.c.obj

[2/2] Linking C executable cmTryCompileExec2120850158.exe

FAILED: cmd.exe /c cd . && C:\llvm_build\RelWithDebInfo\bin\clang.exe     CMakeFiles\cmTryCompileExec2120850158.dir\testCCompiler.c.obj  -o cmTryCompileExec2120850158.exe   && cd .

clang.exe: error: unable to execute command: program not executable


clang.exe: error: linker command failed with exit code 1 (use -v to see invocation)


ninja: build stopped: subcommand failed.

Похоже, что cmake пытается протестировать clang с параметрами Windows /nologo и /showIncludes. Я не могу понять, как сказать cmake передавать правильные аргументы.

FWIW Я использую 64-битную Windows 7

РЕДАКТИРОВАТЬ:

Итак, я просмотрел встроенные файлы cmake и обнаружил, что файл CMakeClDeps.cmake был виновником добавления параметров /nologo /showIncludes. Похоже, что если я устанавливаю Clang в качестве компилятора, тогда cmake думает, что компилятором является Visual Studio (он устанавливает MSVC_C_ARCHITECTURE_ID на x86).

Я удалил строку в CMakeDetermineCompilerId.cmake, которая устанавливает MSVC_C_ARCHITECTURE_ID, и после повторной попытки получаю следующие ошибки:

-- The C compiler identification is Clang 3.5.0
-- The CXX compiler identification is Clang 3.5.0
-- Check for working C compiler using: Ninja
-- Check for working C compiler using: Ninja -- broken
CMake Error at C:/Program Files (x86)/CMake 2.8/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:61 (message):
  The C compiler "C:/llvm_build/RelWithDebInfo/bin/clang.exe" is
  not able to compile a simple test program.

  It fails with the following output:

   Change Dir: C:/test_proj/build/CMakeFiles/CMakeTmp



  Run Build Command:C:/ninja/ninja.exe cmTryCompileExec2815594422

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


  [2/2] Linking C executable cmTryCompileExec2815594422.exe


  FAILED: cmd.exe /c cd .  &&
  C:\llvm_build\RelWithDebInfo\bin\clang.exe
  CMakeFiles\cmTryCompileExec2815594422.dir\testCCompiler.c.obj -o
  cmTryCompileExec2815594422.exe && cd .


  clang.exe: error: unable to execute command: program not executable



  clang.exe: error: linker command failed with exit code 1 (use -v to see
  invocation)



  ninja: build stopped: subcommand failed.






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


-- Configuring incomplete, errors occurred!
See also "C:/test_proj/build/CMakeFiles/CMakeOutput.log".
See also "C:/test_proj/build/CMakeFiles/CMakeError.log".

person reynman    schedule 23.03.2014    source источник
comment
Можете ли вы попробовать в начале вашего файла cmake написать: remove_definitions( /nologo ) и remove_definitions( /showIncludes )? Это может сработать, но если это так, это небольшой обходной путь.   -  person    schedule 23.03.2014
comment
В противном случае вы можете просмотреть CMakeCCompilerId.c и CMakeCXXCompilerId.cpp и убедиться, что что-то не так.   -  person    schedule 23.03.2014
comment
@Shingetsu Удаление определений ничего не изменило, и я ничего не нашел, просматривая эти файлы. Но я нашел, откуда берутся параметры / nologo / showIncludes, и отредактировал свой вопрос.   -  person reynman    schedule 23.03.2014
comment
Проверьте, не заданы ли в этом же файле какие-либо другие параметры MSVC, и замените их на clang. Обратите внимание, что CMake изначально не поддерживает clang (пока). Вы можете попробовать вручную переопределить 90% необходимых параметров, как показано в этом сообщении: stackoverflow.com/questions/7031126/   -  person    schedule 23.03.2014


Ответы (2)


Не знаю, может ли это быть полезно, но у меня была та же ошибка. Теперь я могу скомпилировать с помощью clang (3.7.1) / ninja (1.6) / cmake (3.4.1) в Windows, выполнив следующие действия в каталоге сборки:

  1. загрузить соответствующий файл vcvarsXX.bat (например, "<Your Visual Studio location>\VC\vcvarsall.bat" x86)
  2. установите для CC и CXX значение clang-cl (вместо clang и clang++)
  3. запустить cmake -G Ninja <project>
  4. запустить cmake --build .
person jineff    schedule 09.03.2016
comment
Знаете ли вы, может ли созданный с помощью этой настройки файл compile_commands.json быть передан в инструмент clang-tidy или инструмент clan-tidy ожидает аргументов командной строки clang.exe? - person Knitschi; 01.04.2017
comment
Извините за задержку, не знаю. - person jineff; 19.04.2017

Оказалось, что второй набор ошибок, который я получил, связан с тем, что clang не может найти компоновщик. Я создал clang с помощью Visual Studio, но в то время он не смог найти компоновщик Visual Studio. Все, что мне нужно было сделать, это запустить его в консоли разработки Visual Studio.

CMake по-прежнему считает clang компилятором Visual Studio, поэтому в файле CMakeDetermineCompilerId.cmake есть строка, которая выглядит так:

set(MSVC_${lang}_ARCHITECTURE_ID "${ARCHITECTURE_ID}")

и я изменил его, чтобы он выглядел так

if (COMPILER_ID MATCHES "MSVC")
  set(MSVC_${lang}_ARCHITECTURE_ID "${ARCHITECTURE_ID}")
endif()

Надеюсь, это не нарушит никаких других функций CMake.

person reynman    schedule 23.03.2014
comment
У меня все еще возникают проблемы - у меня не было проблем с определением его как MSVC. Я установил CMAKE_CXX_COMPILER_ID = Clang, но почему-то он не работает аналогично вашим последним ошибкам. - person LB--; 11.08.2014
comment
У меня это не работает в CMake 3.6.1. Я все еще получаю флаги / nologo и т. Д., Которые вызывают сбой при компиляции тестовой программы. Я вижу, что CMAKE_DETERMINE_COMPILER_ID (в CMakeDetermineCompilerId.cmake) всегда устанавливает родительскую область MSVC _ $ {lang} _ARCHITECTURE_ID и пытался установить только это, если он установлен в локальной области, но затем я получаю CMAKE_RC_COMPILER not set. - person beaslera; 02.08.2016