2016-05-22 18 views
4

私はCMakeの初心者で、最近私の現在のプロジェクトをVisual Studio 2015ソリューションからCMakeプロジェクトに移行しました。数日間はかかりましたが、今は私のプロジェクトが完全に移行され、生成されたVisual Studioソリューションが元のソリューションとまったく同じように見えると感じています。私はまだMSVCとプラットフォームツールセットv140を使用して私のプロジェクトの罰金を構築することができます。今度は、私はプロジェクトを別のコンパイラでビルドしてCMakeのメリットを試したかったのです。特に、私のプロジェクトには、標準に準拠していないと思われるテンプレート関連のコードがいくつかあります。そのため、テンプレート関連のMSVCよりも厳しいClangでビルドしたかったのです。これを行うために、私はCMake GUI、選択したソースコードとバイナリパスを開始し、configureをクリックし、 "Visual Studio 14 2015"を選択し、 "v140_clang_3_7"をプラットフォームツールセットフィールドに入力しました。CMake with 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の調査の後、私はVS2015のアップデート2をインストールすることを決めました。問題を修正できると思っていますが、これはあなたが上に見ているものとは異なるエラーにつながるだけです。

私はオリジナルのVSソリューションを利用して、そこにあるClangにプラットフォームツールセットを設定しようとしました。まだコンパイルされませんでしたが、少なくとも、私には実際には意味をなさない妥当なエラーメッセージが表示されました(ソリューションの「警告レベル」プロパティーには期待していなかった値があります)。しかし、このエラーログでは、どこから問題の原因を探し始めるか分かりません。

私はここで私のCMakeコードを共有することができましたが、それが役立つかどうかはわかりません。プロジェクトコードは複数のファイルに分割されているので、ファイルを共有するのは少し複雑ですし、問題の原因が最初にCMakeファイルで見つかるかどうかもわかりません。私は実際には、問題の原因がプロジェクトコードそのものとは無関係かもしれないと仮定しています。私はこのエラーに関する情報のためにグーグルで試してみましたが、残念ながら私が得たものは約5回のヒットでしたが、そのすべてが上記のエラーログを含み、問題の解決策はありませんでした。私はどこから探し始めるべきかわからない。誰もがこれにいくつかの経験を持って、正しい方向に私を導くことができますか?あなたがアイデアを持っている場合、または私のコードのいずれかがエラーの原因を見つけるのに役立つことを期待していることを知らせてください。

+0

このソート済みの回答はありますか? 'Element の値が " ProgramDatabase "。 – jml

+1

という無効な値になっています。残念ながら、私は問題自体を解決しませんでしたが、いくつかを発見しました。まず第一に、Visual Studioは実際には、プロジェクトのすべてのプロパティが、使用しているコンパイラと互換性があることを期待しています。たとえば、clangの警告レベルをmaxに設定するには、/ W4の代わりに-Weverythingを使用します。 cmakeでフラグを手動で設定する場合は、これを考慮する必要があります。さもなければ、どこでもそれらの「無効な値」のエラーが発生します。私がやっていることは(今のところ)CMakeのデフォルトのツールセットを使ってソリューションを生成し、その後VSのツールセットと不良フラグを手動で変更することです。それはうまく動作します。 –

答えて

5

上記の@jml質問につきましては、Element <DebugInformationFormat> has an invalid value of "ProgramDatabase"についてコメントしてください。コンパイラのコマンドライン引数を変更する必要があります。たとえば、DebugInformationFormat = ProgramDatabaseはclコンパイラの/ Ziオプションであり、clangでは不明です。そのためには "-g2 -gdwarf-2"を使うべきです。例外の場合、clは/ EHscを使用しますが、clangの場合は-fexceptionsでなければなりません。

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++やリンカのセクションの設定を通過し、推奨値で見ている:私のcmakeのファイルでは、私は次のようでした。基本的にはclangの典型的なLinuxオプションを使うことができます。また、いくつかのオプションの前にms-が付いています。プロジェクトのプロパティで見つけることができます。

+0

ありがとうございます。 – jml

+0

私は実際にVS2015のプロジェクトプロパティエリアでこれを解決できましたが、正確なステップを取り戻すことは難しい課題です。私はその情報を見つけると私はポストバックします。 – jml

0

おそらく、この問題は、古いWindows SDKの使用に関連していました。最後に利用可能なWindows SDKを使用してくださいConfiguration Properties -> General -> Windows SDK Version

+0

それは非常に可能です。このトピックが作成されて以来、最新のテストからわかる限り、新しいバージョンのCMakeも作成されており、エラーはそれ以上発生していないようです。コマンドライン引数を手動で変換すると仮定しているにもかかわらず、 "無効な引数"のエラーが表示されます。それはちょっと精巧ですが、うまくいくはずです。 –