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



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


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


答え:


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



  1. MinGW をダウンロードしてインストールし (必ず C++ コンパイラをインストールしてください)、bin フォルダーを PATH に入れます (私は MinGW 4.6.1 を持っていて、別のコンピューターで 4.6.2 を使用して正常にテストしました)

  2. PATH に Python があることを確認してください (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. コマンド ラインを開いてビルド フォルダに移動します

  10. コマンド cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..\llvm-3.0.src を実行します



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


    • これは「configure」コマンドと同等の機能を果たし、makefiles とすべてがビルド フォルダーに生成されます


    • これには数分かかります


  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 オプションの出力の最後近くを検索します-L が散在する .o ファイル名に注意してください。Clang は g++ と同じオプションの多くを使用するため、g++ の出力からその行を文字通りコピーして貼り付けました)


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


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


  4. .exe を実行

  5. プログラムが実行されるはずです。


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


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



  1. Windows ヘッダーは機能しているようです。

  2. 現在、32 ビットでのみ機能します。

  3. 64 ビットは正常にコンパイルされますが、アセンブルされません。

  4. SSE はおそらく問題ありません。 ([Mysticial は] 32 ビットで動作する SSE をテストしていません。)


いくつかのコードの回答


 $ cat t.c #include <stdio.h>
int main(int argc, char **argv) { printf("hello world\n");
} $ clang t.c $ ./a.out hello world
 $ cat ~/t.c typedef float V __attribute__((vector_size(16)));
V foo(V a, V b) { return a+b*a;
}
 $ clang ~/t.c -E # 1 "/Users/sabre/t.c" 1  typedef float V __attribute__((vector_size(16)));
V foo(V a, V b) { return a+b*a;
}
 $ clang -fsyntax-only ~/t.c 
 $ clang -fsyntax-only ~/t.c -pedantic /Users/sabre/t.c:2:17: warning: extension used typedef float V __attribute__((vector_size(16)));     ^ 1 diagnostic generated. 
 $ clang -cc1 ~/t.c -ast-print typedef float V __attribute__(( vector_size(16) ));
V foo(V a, V b) { return a + b * a;
}
 $ clang ~/t.c -S -emit-llvm -o - define <4 x float>
@foo(<4 x float>
%a, <4 x float>
%b) { entry:
%mul = mul <4 x float>
%b, %a
%add = add <4 x float>
%mul, %a
ret <4 x float>
%add } $ clang -fomit-frame-pointer -O3 -S -o - t.c # On x86_64 ... _foo: Leh_func_begin1: mulps %xmm0, %xmm1 addps %xmm1, %xmm0 ret Leh_func_end1: