Сборка c ++ проекта для Windows с CMake, Clang и Ninja

В настоящее время на Windows установлены 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/CMakeTmpRun Build Command:C:/ninja/ninja.exe cmTryCompileExec375034429

[1/2] Building C object
CMakeFiles\cmTryCompileExec375034429.dir\testCCompiler.c.obj[2/2] Linking C executable cmTryCompileExec375034429.exeFAILED: 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 executableclang.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 executableclang.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/CMakeTmpRun Build Command:C:/ninja/ninja.exe cmTryCompileExec2815594422

[1/2] Building C object
CMakeFiles\cmTryCompileExec2815594422.dir\testCCompiler.c.obj[2/2] Linking C executable cmTryCompileExec2815594422.exeFAILED: 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 executableclang.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".

14

Решение

Не знаю, может ли это быть полезным, но у меня была та же ошибка. Теперь я могу скомпилировать с помощью 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 .
5

Другие решения

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

CMake все еще думает, что clang — это визуальный студийный компилятор, поэтому в CMakeDetermineCompilerId.cmake В файле есть строка, которая выглядит так:

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

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

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

Надеемся, что это не нарушает другие функциональные возможности CMake.

3

По вопросам рекламы [email protected]