2016-05-22 9 views
4

Я новичок в CMake и недавно перенес свой текущий проект из решения Visual Studio 2015 в проект CMake. Мне потребовалось несколько дней, но теперь я нахожусь в точке, где мой проект полностью переносится, и созданное решение Visual Studio выглядит так же, как и исходное решение. Я все еще могу создать свой проект при использовании MSVC и инструментальных средств платформы v140. Теперь, после всего этого, я хотел попробовать преимущества CMake, создав свой проект разными компиляторами. В частности, в моем проекте есть некоторый код, связанный с шаблонами, который, как мне кажется, не соответствует стандарту, поэтому я хотел его создать с помощью Clang, который, как я знаю, более строг, чем MSVC для связанных с шаблонами материалов. Для этого я начал использовать CMake GUI, выбранный исходный код и двоичные пути, щелкнул configure, выбрал «Visual Studio 14 2015» и набрал «v140_clang_3_7» в поле набора инструментов платформы, оставив все остальные настройки нетронутыми.CMake с VIsual Studio 2015 и Clang

К сожалению, при этом, CMake не удается настроить (и генерация) мое решение со следующей ошибкой:

The C compiler identification is Clang 3.7.0 
The CXX compiler identification is Clang 3.7.0 
Check for working C compiler using: Visual Studio 14 2015 
Check for working C compiler using: Visual Studio 14 2015 -- broken 
CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.5/Modules/CMakeTestCCompiler.cmake:61 (message): 
    The C compiler "C:/Program Files (x86)/Microsoft Visual Studio 
    14.0/VC/bin/cl.exe" is not able to compile a simple test program. 

    It fails with the following output: 

    Change Dir: C:/Users/marku/Desktop/build_muell/CMakeFiles/CMakeTmp 



    Run Build Command:"C:/Program Files (x86)/MSBuild/14.0/bin/MSBuild.exe" 
    "cmTC_c4641.vcxproj" "/p:Configuration=Debug" "/p:VisualStudioVersion=14.0" 

    Microsoft (R)-Buildmodul, Version 14.0.25123.0 


    Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten. 





    Der Buildvorgang wurde am Mo, 23.05.2016 00:52:13 gestartet. 


    Das in einem BeforeTargets-Attribut bei "C:\Program Files 
    (x86)\MSBuild\14.0\Microsoft.Common.targets\ImportAfter\Xamarin.Common.targets 
    (34,37)" aufgef�hrte Ziel "_ConvertPdbFiles" ist nicht im Projekt vorhanden 
    und wird daher ignoriert. 


    Das in einem AfterTargets-Attribut bei "C:\Program Files 
    (x86)\MSBuild\14.0\Microsoft.Common.targets\ImportAfter\Xamarin.Common.targets 
    (34,70)" aufgef�hrte Ziel "_CollectPdbFiles" ist nicht im Projekt vorhanden 
    und wird daher ignoriert. 


    Das in einem BeforeTargets-Attribut bei "C:\Program Files 
    (x86)\MSBuild\14.0\Microsoft.Common.targets\ImportAfter\Xamarin.Common.targets 
    (40,38)" aufgef�hrte Ziel "_CollectMdbFiles" ist nicht im Projekt vorhanden 
    und wird daher ignoriert. 


    Das in einem AfterTargets-Attribut bei "C:\Program Files 
    (x86)\MSBuild\14.0\Microsoft.Common.targets\ImportAfter\Xamarin.Common.targets 
    (40,71)" aufgef�hrte Ziel "_CopyMdbFiles" ist nicht im Projekt vorhanden 
    und wird daher ignoriert. 


    Projekt 
    "C:\Users\marku\Desktop\build_muell\CMakeFiles\CMakeTmp\cmTC_c4641.vcxproj" 
    auf Knoten "1" (Standardziele). 


    PrepareForBuild: 


    Das Verzeichnis "cmTC_c4641.dir\Debug\" wird erstellt. 

    Das Verzeichnis "C:\Users\marku\Desktop\build_muell\CMakeFiles\CMakeTmp\Debug\" wird erstellt. 

    Das Verzeichnis "cmTC_c4641.dir\Debug\cmTC_c4641.tlog\" wird erstellt. 


    InitializeBuildStatus: 


    "cmTC_c4641.dir\Debug\cmTC_c4641.tlog\unsuccessfulbuild" wird erstellt, da "AlwaysCreate" angegeben wurde. 


    C:\Program Files 
    (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.Cpp.Clang.targets(210,5): 
    error : Element <DebugInformationFormat> has an invalid value of 
    "ProgramDatabase". 
    [C:\Users\marku\Desktop\build_muell\CMakeFiles\CMakeTmp\cmTC_c4641.vcxproj] 



    Die Erstellung des Projekts 
    "C:\Users\marku\Desktop\build_muell\CMakeFiles\CMakeTmp\cmTC_c4641.vcxproj" 
    ist abgeschlossen (Standardziele) -- FEHLER. 





    Fehler beim Buildvorgang. 






    "C:\Users\marku\Desktop\build_muell\CMakeFiles\CMakeTmp\cmTC_c4641.vcxproj" 
    (Standardziel) (1) -> 


    (ClCompile Ziel) -> 


    C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.Cpp.Clang.targets(210,5): error : Element <DebugInformationFormat> has an invalid value of "ProgramDatabase". [C:\Users\marku\Desktop\build_muell\CMakeFiles\CMakeTmp\cmTC_c4641.vcxproj] 





     0 Warnung(en) 

     1 Fehler 





    Verstrichene Zeit 00:00:00.70 






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


Configuring incomplete, errors occurred! 
See also "C:/Users/marku/Desktop/build_muell/CMakeFiles/CMakeOutput.log". 
See also "C:/Users/marku/Desktop/build_muell/CMakeFiles/CMakeError.log". 

Теперь я понятия не имею, что смысл этой ошибки или то, что может быть причиной его , кроме того факта, что CMake, по-видимому, пытается скомпилировать тестовую программу, которая терпит неудачу. Материал «Xamarin» в журнале ошибок особенно неуместен. Я уже пробовал пару вещей, чтобы решить эту проблему. Первоначально я был на Visual Studio 2015 Update 1 и фактически получал другую ошибку (которую я не помню, потому что я ее не документировал). После некоторых исследований Google я решил установить Update 2 из VS2015, надеясь, что это может устранить проблему, но это приведет только к другой ошибке, которую вы видите выше.

Просто из любопытства я также взял свое оригинальное решение VS и попытался установить набор инструментов платформы для Clang. Он по-прежнему не компилируется, но, по крайней мере, он дал мне разумное сообщение об ошибке, которое действительно имело для меня какое-то значение (упоминание о том, что свойство «warning level» для решения имеет значение, которого оно не ожидало). Однако с этим журналом ошибок я понятия не имею, где даже начать искать источник проблемы.

Теперь я мог бы поделиться своим кодом CMake здесь, но я не уверен, что это будет полезно. Код проекта разделен между несколькими файлами, поэтому его совместное использование немного сложнее, и я также не уверен, что причина проблемы может быть найдена в файлах CMake в первую очередь. Я фактически предполагаю, что причина проблемы может быть не связана с самим кодом проекта. Я пробовал искать информацию об этой ошибке, но, к сожалению, все, что у меня было, было около пяти ударов, все из которых содержали только этот журнал ошибок без каких-либо решений проблемы. Я не уверен, с чего начать искать. У кого-то есть опыт с этим и может привести меня в правильном направлении? Пожалуйста, дайте мне знать, если у вас есть идея или ожидаете, что увидеть какой-либо из моих кодов может помочь найти причину ошибки.

+0

Вы когда-нибудь получали ответ на этот вопрос? Я получаю очень похожую ошибку о 'Element имеет недопустимое значение « ProgramDatabase ».' – jml

+1

К сожалению, я не решил проблему самостоятельно, но обнаружил несколько вещей. Прежде всего, Visual Studio на самом деле ожидает, что все свойства в проекте будут совместимы с используемым компилятором. Таким образом, чтобы установить уровень предупреждения для max для clang, например, вы должны использовать -Weverything вместо/W4. Это нужно учитывать при ручной установке флагов с помощью cmake. В противном случае вы получите ошибки «недопустимого значения». То, что я делаю (на данный момент), - это сгенерировать решение с помощью набора инструментов по умолчанию в CMake, а затем вручную изменить набор инструментов и плохие флаги в VS после этого. Это прекрасно работает. –

ответ

5

Просто, чтобы ответить на вопрос @jml выше в комментариях к Element <DebugInformationFormat> has an invalid value of "ProgramDatabase". Вы должны изменить аргументы командной строки компилятора. Например, DebugInformationFormat = ProgramDatabase является параметром/Zi для компилятора cl, который неизвестен для clang. Для этого вы должны использовать «-g2 -gdwarf-2». Для исключений cl использует/EHsc, но для clang это должны быть -fexceptions. В моем файле Cmake я сделал следующее:

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0 -g2 -gdwarf-2 -fexceptions") 
else() 
    # for cl.exe 
endif() 

Самым простым способом узнать эти параметры, чтобы открыть свойства любого проекта и пройти через настройку в C++ или в разделе Linker и посмотреть в предложенных значениях. В основном вы можете использовать типичные варианты linux для clang. Кроме того, есть несколько вариантов с префиксом ms-, вы можете найти их в свойствах проекта.

+0

Большое вам спасибо. – jml

+0

Я действительно смог решить это в области свойств проекта в VS2015, но получение точных шагов назад будет проблемой. Я отправлю сообщение, если найду эту информацию. – jml

0

Скорее всего, проблема была связана со старым использованием Windows SDK.Использовать последний доступный Windows SDK в Configuration Properties -> General -> Windows SDK Version

+0

Это очень возможно. Также появились новые версии CMake, так как этот раздел был создан, и, похоже, это не вызвало ошибки, насколько я могу судить по моему последнему тестированию. Вы по-прежнему получаете ошибки «неправильного аргумента», хотя я предполагаю, что вы просто должны преобразовать аргументы командной строки вручную. Это немного сложно, но это должно сработать. –