аргумент в этом случае.

емые коллеги по C ++,

после того, как я некоторое время использовал набор инструментов Visual Studio для сборки на окнах, я решил попробовать Clang 5.

Я установил двоичные файлы LLVM 5.0.0, среду сборки Ninja, VS 2017 Tools и CMake 3.9.3. Конечная цель состоит в том, чтобы иметь возможность компилировать приложения C и C ++ для Windows, используя VS Code с интеграцией CMake в качестве «IDE» и Clang с LLD в качестве компилятора и компоновщика.

Компиляция и выполнение простой программы работали отлично (скриншот соответствующей истории терминала). Clang автоматически обнаружил стандартную библиотеку для Windows в каталогах VS Tools и вывел исполняемый файл.

Следующим шагом была настройка простой сборки с помощью Ninja (скриншот файла ninja.build и истории терминала). Процесс сборки работал, как и ожидалось, и создал рабочий исполняемый файл, как и раньше.

Проблемы начались, когда я начал интегрировать CMake в процесс. Я ожидаю, что CMake создаст файл сборки ninja и запустит его, правильно? Я попробовал следующий файл CMakeLists

cmake_minimum_required(VERSION 3.9)

project(Test)

add_executable(Test main.c)

и называется 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".

Я предполагаю, что проблема связана с вызовом CMake clang с опциями стиля VS с использованием косой черты, а не с минусом, как требует clang.

Спасибо за помощь, ребята, я ценю это :-)

Просто оставьте мне комментарий, если вам нужна дополнительная информация.

Ответ на пост Флориан

Я попробовал команду 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"

CMake создал файл сборки для ниндзя.

Я побежалninja all построить исполняемый файл какTest, Я переименовал его вTest.exe и программа выполнена счастливо. Пока что ... успехов !!! Но гораздо сложнее, чем я ожидал.

 Simon04 окт. 2017 г., 01:04
@Antonio Спасибо за ваш ответ, но похоже, что CMake не может указать набор инструментов для ниндзя. Я пыталсяcmake -G Ninja -T LLVM-VS2017 но он сказал мне, что спецификация набора инструментов не поддерживается для соответствующего генератора, что плохо :-( Я бы не удивился, если бы он работал, потому что, как упоминалось выше, на самом деле у меня установлены все необходимые инструменты, кроме VS Studio
 Antonio04 окт. 2017 г., 00:37
Не ответ на ваш актуальный вопрос, но может помочь:stackoverflow.com/a/38174328/2436175

Ответы на вопрос(3)

Вдохновленный«Способы компиляции с Clang на Windows» сообщение в блоге от @Unspongeful и после некоторого расширенного тестирования у меня сработала следующая командная строка (и да, это одна большая команда, которую я просто разбил на несколько строк для лучшей читабельности):

> 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"

Вот некоторая справочная информация:

Я ввел ваши флаги компоновщика сLDFLAGS переменная окружения

ВидетьПередача параметров компилятора cmake

Я уменьшилPATH переменная окружения, чтобы просто указать, гдеninja находится, потому что CMake выбирал мойMinGW набор инструментов (который я не хотел включать в процесс сборки)

Относится кПеременная окружения, используемая CMake для обнаружения инструментов компилятора Visual C ++ для ниндзя

Определение идентификаторов компилятора "обходит проверку на работоспособность тестов компилятора и базовых данных компилятора"

Смотри устаревшее, но иногда полезноеCMakeForceCompiler модуль

И я поставилCMAKE_SYSTEM_NAME вGeneric чтобы избежать добавления каких-либо дополнительных платформенных флагов компилятора / компоновщика, добавленных CMake

ВидетьКак частично отключить проверку пользовательского компилятора cmake C / C ++

Кажется, в данный момент вам нужно обойти множество автоматических проверок 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
 Simon06 окт. 2017 г., 10:57
Да ... это намного более длинная команда, чем я ожидал. Позвольте мне попробовать ваше предложение, и я сообщу. Большое спасибо за вашего обширного исследования человека.
 Florian06 окт. 2017 г., 11:34
@ Симон Добро пожаловать. И да, вероятно, лучше / проще поместить все это в файл набора инструментов CMake. Если вы проверили приведенную выше командную строку, я могу добавить подход цепочки инструментов для упрощения обработки (как вэтот блог из @MatthewHungerford).
 Simon10 окт. 2017 г., 19:09
Я начал проблему на CMakes Gitlab. Если вы хотите посмотреть ...gitlab.kitware.com/cmake/cmake/issues/17329#
 Simon06 нояб. 2017 г., 21:41
Я обновил свой вопрос ответом на ваш пост. Можете ли вы предоставить мне дополнительную информацию, т.е. один CMakeLists.txt?
 Florian06 нояб. 2017 г., 22:55
@Simon Я добавлю еще немного информации в течение следующих дней. Только одна вещь о пути кninja, Так как этоPATH переменная окружения мы переписываем это было бы в вашем случае простоPATH="C:\MeineProgramme\Ninja\bin" (без исполняемого файла).
Решение Вопроса

как мне нравится. Это не идеально, но работает лучше, чем подход Florians с установкой имени системы вобщий (которым я пользуюсь уже некоторое время)

Сначала я настроил VS Code для использования терминала разработчиков VS в качестве стандартного терминала. Я сделал это, добавив следующую строку в настройки кода VS

"terminal.integrated.shell.windows": "C:\\MeineProgramme\\Visual_Studio\\2017\\BuildTools\\Common7\\Tools\\LaunchDevCmd.bat"

После запуска терминала в VS Code мне нужно вызвать соответствующий пакетный файл, который устанавливает необходимые переменные среды (в моем случаеvcvars64.bat). Их можно найти в

C:\MeineProgramme\Visual_Studio\2017\BuildTools\VC\Auxiliary\Build

После перехода в каталог сборки я запускаю 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"

это побуждает CMake использовать все мои установленные инструменты LLVM. Не толькоclang а такжеlld (убедитесь, что вы используете lld-link, которая поддерживает параметры во главе с/), но иllvm-ar а такжеllvm-ranlib, Единственный используемый инструмент сборки MS - это компилятор ресурсов, который я сейчас не использую.

Пока успех, я думаю.

Не стесняйтесь обращаться ко мне или комментировать ниже, если у вас есть дополнительные вопросы.

 Royi19 авг. 2018 г., 00:54
Ты говоришьthis encourages CMake to use all my installed LLVM tools., А именно, некоторые параметры системной среды, которые были установлены вvcvars64.bat сделал это случиться. Я спросил, если вы конкретно, какие из них (потому что это добавляет много).
 Simon19 авг. 2018 г., 00:43
@ Рой, я не понимаю. Что вы имеете в виду? Это работает с обычным cmd, но вы должны иметьVisual_Studio\2017\BuildTools\VC\Auxiliary\Build на пути или ссылкиvcvars64.bat с полным путем. Призыв к cmake одинаков в любой среде.
 Royi18 авг. 2018 г., 22:59
Какие переменные необходимы для ниндзя для этого? Я хочу иметь возможность подражать этому самостоятельноcmd окно.
 Simon20 авг. 2018 г., 08:30
Да, я понятия не имею, но LLVM нужно установить переменные include и библиотеки, чтобы найти нужные файлы во время сборки. Почему бы вам просто не выполнить скрипт среды?
 florestan12 апр. 2018 г., 17:45
Вы могли бы также использоватьx64 Native Tools Command Prompt for VS 2017 ярлык расположен вC:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2017\Visual Studio Tools\VC, Это будет называтьvcvars64.bat для вас автоматически.

когда пытался использовать clang cmake и msvc 2017 вместе. По крайней мере, для очень простого тестового проекта я смог запустить все, но я довольно новичок в этом, так что, возможно, мое решение не решит ваши проблемы.

Так или иначе. Насколько я знаю, вы должны использоватьclang-cl.exe скорее, чемclang.exe с VS. Тем не менее, сборка все еще не удалась для меня в конфигурациях x86 из-за некоторых проблем компоновщика относительно несовместимости библиотек x86 и x64.

Итак, вот мое решение для получения конфигураций x64 и x86, построенных в VS 2017.

Загрузить и установитьОБЕ установщики windows clang / llvm изhttp://releases.llvm.org/download.html, Вам не нужно добавлять их в путь, так как позже мы явно укажем путь.Создать папку сCMakeLists.txtи откройте это в VS черезOpen Folder Диалог.вCMake меню, выберитеChange CMake Settings > CMakeLists.txt, Это создастCMakeSettings.json содержит настройки для всех конфигураций сборки.

Укажите пути к компиляторам x64 / x86 cmake вcmakeCommandArgs для всех конфигураций. Моя выглядит так:

{    // See https://go.microsoft.com//fwlink//?linkid=834763 for more information about this file.

"configurations": [
    {
        "name": "x86-Debug",
        "generator": "Ninja",
        "configurationType": "Debug",
        "inheritEnvironments": [ "msvc_x86" ],
        "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
        "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
        "cmakeCommandArgs": "-D CMAKE_CXX_COMPILER=D:/windows/LLVM5_x86/bin/clang-cl.exe",
        "buildCommandArgs": "-v",
        "ctestCommandArgs": ""
    },
    {
        "name": "x86-Release",
        "generator": "Ninja",
        "configurationType": "RelWithDebInfo",
        "inheritEnvironments": [ "msvc_x86" ],
        "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
        "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
        "cmakeCommandArgs": "-D CMAKE_CXX_COMPILER=D:/windows/LLVM5_x86/bin/clang-cl.exe",
        "buildCommandArgs": "-v",
        "ctestCommandArgs": ""
    },
    {
        "name": "x64-Debug",
        "generator": "Ninja",
        "configurationType": "Debug",
        "inheritEnvironments": [ "msvc_x64" ],
        "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
        "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
        "cmakeCommandArgs": "-D CMAKE_CXX_COMPILER=D:/windows/LLVM5/bin/clang-cl.exe",
        "buildCommandArgs": "-v",
        "ctestCommandArgs": ""
    },
    {
        "name": "x64-Release",
        "generator": "Ninja",
        "configurationType": "RelWithDebInfo",
        "inheritEnvironments": [ "msvc_x64" ],
        "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
        "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
        "cmakeCommandArgs": "-D CMAKE_CXX_COMPILER=D:/windows/LLVM5/bin/clang-cl.exe",
        "buildCommandArgs": "-v",
        "ctestCommandArgs": ""
    }
]

}

Теперь вы сможете без проблем создавать конфигурации как x64, так и x86.

 florestan31 окт. 2017 г., 11:25
Хорошо, я неправильно поняла ваш вопрос, извините. Интересно, что даже моя VS не смогла использовать правильный компилятор, не указав его явно, как указано выше. Я играл немного без VS, и я могу только подтвердить вашу проблему :-( CMake, кажется, полностью игнорируетCMAKE_CXX_COMPILER аргумент в этом случае.
 Simon30 окт. 2017 г., 17:00
Спасибо за ваши усилия, Флорестан, но я не уверен, правильно ли вы поняли мой вопрос. Я не прошу проблемы с интеграцией VS. Я хочу избегать VS, где это возможно, и устанавливал только инструменты VS для доступа к стандартным библиотекам и заголовкам Windows. Моя проблема в том, что CMake не определяет clang или clang-cl в качестве допустимого компилятора с Ninja в качестве генератора.

Ваш ответ на вопрос