親愛なる仲間の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
に変更すると、プログラムは問題なく実行されました。これまで...成功!!!しかし、予想以上に複雑です。
私はついに、自分の好きなツールを自分に合った方法で使用する方法を見つけました。完全ではありませんが、システム名を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ビルドツールは、現在使用していないリソースコンパイラです。
これまでのところ成功したと思います。
さらに質問がある場合は、遠慮なく私に連絡するか、以下にコメントしてください。
「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"
背景情報を次に示します。
LDFLAGS
環境変数を使用してリンカーフラグを挿入しました
CMakeがPATH
ツールチェーン(ビルドプロセスに含めたくない)を選択していたため、ninja
環境変数をMinGW
が配置されている場所を指すように減らしました。
コンパイラーIDの定義は、「動作するコンパイラーと基本的なコンパイラー情報テストのチェックをバイパスします」
廃止されたが、時には役立つ CMakeForceCompiler
module
そして、CMakeによって追加されたプラットフォーム固有のコンパイラ/リンカーフラグを避けるために、 CMAKE_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
Clang cmakeとmsvc 2017を一緒に使用しようとすると、同様の問題が発生していました。少なくとも非常に単純なテストプロジェクトでは、すべてを実行することができましたが、私はそのようなものにはまったく慣れていないので、私のソリューションでは問題を解決できないかもしれません。
とにかく。私の知る限り、VSではclang-cl.exe
ではなくclang.exe
を使用する必要があります。ただし、x86とx64ライブラリの非互換性に関するいくつかのリンカーの問題のため、x86構成でのビルドはまだ失敗しました。
そこで、VS 2017で構築したx64とx86の両方の構成を取得するための私のソリューションを次に示します。
CMakeLists.txt
を使用してフォルダーを作成し、Open Folder
ダイアログを介してVSで開きます。CMake
メニューで、Change CMake Settings > CMakeLists.txt
を選択します。これにより、すべてのビルド構成の設定を含むCMakeSettings.json
が生成されます。すべての構成の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の両方の構成をエラーなしで構築できるはずです。