web-dev-qa-db-ja.com

WindowsでClangをコンパイルする方法

ClangをWindowsで動作させる方法を探していましたが、問題があります。 Clangを正常にコンパイルできますが、プログラムをコンパイルしようとすると、標準ヘッダーに多数のエラーがあります。

rubenvbの優れたビルド済みバージョンのclang を知っていますが、自分でコンパイルしたいです。また、clangについてのGoingNativeの話を聞いていましたが、clangにはWindowsのサポートがまだ十分ではないと言われていました。 Windowsでclangを動作させるにはどうすればよいですか?

50
Seth Carnegie

次の方法を使用してWindows 7でC++のclangをコンパイルしましたが、Mysticialなどによって検証されています。

  1. MinGW (C++コンパイラをインストールすることを確認してください)をダウンロードしてインストールし、binフォルダーをPATHに配置します(MinGW 4.6.1があり、4.6.2の別のコンピューターで正常にテストされました)
  2. PATHに Python が含まれていることを確認してください(not 3、2.7があります)
  3. (オプション:PATHにPerlがあることを確認します(ActivePerl 5.14.2 64ビットを使用しました))
  4. CMake を取得してPATHに入れます
  5. LLVMダウンロードページ に移動し、LLVM 3.0ソースコードとClangソースコードをダウンロードします。 SVNからコードを取得しないでください。MinGWヘッダーでは機能しません。
  6. ソースコードを抽出します。デスクトップのllvm-3.0.srcという名前のフォルダーにllvmソースがありました
  7. Llvmソースフォルダー内の「tools」フォルダー内の「clang」というフォルダーに直接clangソースを配置します(これは正確に呼び出す必要がありますが、llvmをビルドしますが、clangはビルドしません)。のような:
    • llvmソース
      • autoconfフォルダー
      • ...
      • ツールフォルダ
        • ...
        • clangフォルダー
          • バインディングフォルダー
          • ...
          • Makefileファイル
          • ...
        • ...
      • ...
  8. Llvmソースフォルダーと同じディレクトリに「build」という名前のフォルダーを作成します。
  9. コマンドラインを開き、ビルドフォルダーにcdします
  10. コマンドcmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..\llvm-3.0.srcを実行します

    • (最後の引数は、llvmソースが含まれるフォルダー(およびtools/clangサブディレクトリのclangソース)への相対パスです)

    • これは、「configure」コマンドと同等の処理を行い、メイクファイルとすべてがビルドフォルダーに生成されます。

    • これには数分かかります
  11. コマンドmingw32-makeを実行します

    • これにより、llvmとclangがコンパイルされ、clang実行可能ファイルがbuild/binフォルダーに生成されます
    • これにはおそらく長い時間がかかります。 (並列ビルド、-j<number>オプションを追加することで高速化を試みることができます)他のすべてのプログラムを閉じて、コンピューターが集中できるようにし、長いコンパイルプロセスを妨げないようにすることをお勧めします。コンパイラが書き込み中のフォルダーにロックをかけること(それは私に起こりました)。生成されたファイルをスキャンして邪魔にならないように、ウイルス対策ソフトウェアとファイアウォールソフトウェアをオフにしました。

テストする時間

  1. Build/binフォルダーに.cppファイルを作成します(hello.cppを使用します)。標準ライブラリヘッダーを使用して、インクルードパスとライブラリが機能していることを確認します。非常に単純なプログラムから始めます。

    (私が始めたもの:

    #include <iostream>
    
    int main() {
        std::cout << "hi";
    }
    

  2. コマンドclang hello.cpp -std=c++0x -I"C:\MinGW\lib\gcc\mingw32\4.6.1\include\c++" -I"C:\MinGW\lib\gcc\mingw32\4.6.1\include\c++\mingw32" -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1 -Lc:/mingw/bin/../lib/gcc -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../mingw32/lib -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../.. -L/mingw/lib -lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrtを実行します

    (-Lはライブラリを検索するディレクトリを指定し、-lはリンクするライブラリを指定します)(MinGWを私と同じパスにインストールしていない場合、コマンド「g ++ somefile。」でパスを見つけることができます。 cpp -v "を使用して、g ++にライブラリパスやライブラリファイルなどに使用しているオプションについて勇気を出します。-Lおよび-lオプションの出力の終わり近くを検索します。oファイルに注意してください-Lが散在する名前。Clangはg ++と同じオプションの多くを使用するため、g ++の出力からその行を文字通りコピーして貼り付けました)

    これにより、プログラムがコンパイルされ、a.outという名前のファイルが生成されます。

  3. a.outの名前をa.exeなどに変更します

  4. .exeを実行する
  5. プログラムが実行されます。

Clang(3.0)にはWindowsでまだいくつかの問題があります(これらの問題がLinuxでも発生するかどうかはわかりません)。たとえば、ラムダ(clangはサポートしていません)を-std = c ++ 0xでコンパイルすると、clangがクラッシュし、診断エラーが発生します。 (LLVMで通知されましたIRCこれは、clangがラムダの解析を実装しているが、セマンティック分析ではなく、クラッシュするフェーズであるためです(3.0のラムダ解析を無効にするのを忘れていたため)リリース)、そして彼らはすでにこのバグについて知っています)

また、著名な神秘主義者はこのガイドをテストすることに親切に同意し、彼のテスト中にいくつかの観察を行いました。

  1. Windowsヘッダーは機能しているようです。
  2. 現在、32ビットでのみ機能します。
  3. 64ビットは正常にコンパイルされますが、アセンブルされません。
  4. SSEはおそらく大丈夫です。 ([Mysticialは32ビットで動作するSSEをテストしていません。)
56
Seth Carnegie

ここにWindows 8.1で私の環境で働いたものがあり、全体的にSethの指示に似ていますが、より新しいツールを使用しています。

  1. MinGW 64をC:/MinGWにインストールしました。正確に言うと STLのディストリビューション です。
  2. Python 3をインストールしました。最新バージョンを取得しました。
  3. CMake 3.0.2 をインストールしました
  4. Githubで [〜#〜] llvm [〜#〜] および Clang をフォークし、それらをマシンにクローンして、Clangのリポジトリをllvm\tools\clangフォルダーに配置しました(構造について説明します 公式ページ 、gitの代わりにsvnを使用した例を示しています)。
  5. 「llvm」フォルダーの隣に「build」フォルダーを作成し、「build」フォルダー内で次のコマンドを実行しました:cmake -G "MinGW Makefiles" -D"CMAKE_MAKE_PROGRAM:FILEPATH=C:/MinGW/bin/make.exe" -DCMAKE_BUILD_TYPE=Release ..\llvm(何らかの理由でCMakeが自動的に「make」を見つけることができませんでした)
  6. 次に、実際にビルドするために「make」を実行しました。ビルドには数時間かかりました。
  7. その後、別のフォルダに1.cppを作成し、ラムダ式を実行して「hi」を出力します。
#include <iostream>

int main() {
    []{ std::cout << "hi"; }();
}
  1. また、cppをコンパイルするためのcmdファイルを作成しました。または、他の方法でPATH変数を適切に設定することもできます。 MinGWパッケージのGCCバージョンは異なる場合があることに注意してください。また、Clangにはいくつかの組み込みパスがありますが、特定のGCCバージョンに関連付けられており、私の中には含まれていなかったため、インクルードパスを明示的に指定する必要がありました。
set PATH=<path to the build folder from step 5>/bin;c:/mingw/bin;%PATH% 
clang++ -std=c++11 1.cpp -o 1.exe -I"C:/MinGW/include"
-I"C:/MinGW/include/c++/4.9.1" -I"C:\MinGW\include\c++\4.9.1\x86_64-w64-mingw32" -I"C:\MinGW\x86_64-w64-mingw32\include"
  1. そのコマンドを実行すると、1.cppがコンパイルされて「hi」が出力される1.exeになりました。

何が機能しなかった

  1. VS 2015 CTPのMSVCコンパイラを使用して、MinGW + GCCなしで同じllvm + clangソースを構築しようとしました。 Clangを正常に構築しましたが、唯一の違いは、開発者CMDウィンドウからそれを行う必要があり、cmake -G "Visual Studio 12" ..\llvmを実行してからVisual Studioでソリューションをコンパイルする必要があることです。ただし、Clangはサンプルcppのコンパイルに失敗し、MinGW標準ライブラリヘッダー内の「宣言されていない識別子 'char16_t'」および「__int128はこのターゲットではサポートされていません」について不平を言いました。 clang-clおよびMS STLヘッダーを使用すると、「throw x(y)」指定子について文句を言います。ビルドにいくつかの追加キーを提供する必要があったかもしれませんが、機能させることができませんでした。

C:\ Program Files(x86)\ Microsoft Visual Studio 14.0\VC\include\xiosbase(293,4):エラー:このスロー式はまだコンパイルできません_THROW_NCEE(failure、 "ios_base :: eofbit set"); C:\ Program Files(x86)\ Microsoft Visual Studio 14.0\VC\include\xstddef(56,30):注:マクロ '_THROW_NCEE'から展開#define _THROW_NCEE(x、y)throw x(y)

5
Max Galkin

参照 http://clang.llvm.org/get_started.html#buildWindows

「Visual Studio 11 Win64」とcmakeを使用し、現在利用可能なVS Express for Desktopで動作しました。

また、libにはMinGW-W64を使用し、欠落しているファイルにはSUAを使用しています。 http://mingw-w64.sourceforge.net/ および http://www.suacommunity.com/

W64バイナリで使用するためにclang ++でコンパイルされた.oをリンクするには、W64成果物。

2
Chawathe Vipul

VSを使用してLLVMとclangを構築し、Unixユーザーであるため、コマンドラインからソースを構築することを好みます。

Seth Carnegieの指示に従って、MinGW v4.5.2でLLVM v3.3を使用して、提供されたパッケージではなくSVNリポジトリからビルドしました。

0
Jacob Lärfors