web-dev-qa-db-ja.com

WindowsでCMake、Ninja、Clangを使用してビルドする

親愛なる仲間のC++コーダー、

visual Studioツールチェーンを使用してしばらくの間Windowsをビルドした後、Clang 5を試してみることにしました。

LLVM 5.0.0バイナリ、Ninjaビルド環境、VS 2017 Tools、CMake 3.9.3をインストールしました。最終目標は、VS CodeをCMake統合「IDE」として使用し、ClangとLLDをコンパイラおよびリンカーとして使用して、Windows用のCおよびC++アプリケーションをコンパイルできるようにすることです。

単純なプログラムのコンパイルと実行は完璧に機能しました( それぞれの端末履歴のスクリーンショット )。 Clangは、VS Toolsディレクトリ内でWindowsの標準ライブラリを自動的に検出し、実行可能な出力を生成しました。

次のステップは、Ninjaを使用した単純なビルドのセットアップでした( ninja.buildファイルと端末履歴のスクリーンショット )。ビルドプロセスは期待どおりに機能し、以前と同様に機能する実行可能ファイルを生成しました。

問題は、CMakeをプロセスに統合し始めたときに始まりました。私の期待は、CMakeが忍者ビルドファイルを生成して実行することです、正しいですか?私は次のCMakeListsファイルを試しました

cmake_minimum_required(VERSION 3.9)

project(Test)

add_executable(Test main.c)

cmake -G NinjaでCMakeを呼び出しました。結果の出力は期待はずれであり、私はそれぞれ自分で問題を解決するのに十分な理解がありません。

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

この問題は、clangが要求するように、マイナスではなくスラッシュを使用するVSスタイルオプションでclangを呼び出すCMakeに関連していると思います。

私を助けてくれてありがとう、感謝している:-)

さらに情報が必要な場合は、コメントを残してください。

フロリアンへの回答投稿

フロリアンのコマンドを試してみましたが、忍者へのパスを省略して表記しましたが、うまく機能することがわかりました。

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に変更すると、プログラムは問題なく実行されました。これまで...成功!!!しかし、予想以上に複雑です。

18
Simon

私はついに、自分の好きなツールを自分に合った方法で使用する方法を見つけました。完全ではありませんが、システム名をGenericに設定するFloriansアプローチよりもうまく機能します(これは私がしばらくの間使用していました)

まず、VS Developerターミナルを標準ターミナルとして使用するようにVS Codeをセットアップしました。これを行うには、VS Codeの設定に次の行を追加しました

"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ビルドツールは、現在使用していないリソースコンパイラです。

これまでのところ成功したと思います。

さらに質問がある場合は、遠慮なく私に連絡するか、以下にコメントしてください。

4
Simon

「WindowsでClangでコンパイルする方法」 に触発され、@ Unspongefulからのブログ投稿といくつかの拡張テストの後、次のコマンドラインが機能しました(そしてはい、それは私が読みやすくするためにいくつかの行に分割した1つの大きなコマンドです):

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

背景情報を次に示します。

現時点では、CMakeの多くの自動チェックをバイパスして機能させる必要があるようです。したがって、CMakeチームに確認するか、 問題を提起して 、このシナリオを公式にサポートしてください。

また、Genericシステムの最後の部分は、.exeサフィックスなどのWindows固有の設定をスキップするため、おそらく最良の選択ではありません。

しかし、実際に機能したのはこれだけです。

-- 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
11
Florian

Clang cmakeとmsvc 2017を一緒に使用しようとすると、同様の問題が発生していました。少なくとも非常に単純なテストプロジェクトでは、すべてを実行することができましたが、私はそのようなものにはまったく慣れていないので、私のソリューションでは問題を解決できないかもしれません。

とにかく。私の知る限り、VSではclang-cl.exeではなくclang.exeを使用する必要があります。ただし、x86とx64ライブラリの非互換性に関するいくつかのリンカーの問題のため、x86構成でのビルドはまだ失敗しました。

そこで、VS 2017で構築したx64とx86の両方の構成を取得するための私のソリューションを次に示します。

  1. [〜#〜] both [〜#〜]Windows clang/llvmインストーラーを http://releases.llvm。 org/download.html 。後で明示的にパスを指定するため、それらをパスに追加する必要はありません。
  2. CMakeLists.txtを使用してフォルダーを作成し、Open Folderダイアログを介してVSで開きます。
  3. CMakeメニューで、Change CMake Settings > CMakeLists.txtを選択します。これにより、すべてのビルド構成の設定を含むCMakeSettings.jsonが生成されます。
  4. すべての構成のcmakeCommandArgsでx64/x86 cmakeコンパイラのパスを指定します。私のものは次のようになります。

    {    // 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の両方の構成をエラーなしで構築できるはずです。

1
florestan