web-dev-qa-db-ja.com

MinGW C / C ++ライブラリでClangを使用してコードをコンパイルするにはどうすればよいですか? (float.hの特定の問題)

MinGWのC/C++ライブラリを使用して、clangで正常にコンパイルできる単純なプログラムがあります。

#include <stdio.h>
int main(int argc, char **argv) { printf("Hello world!\n"); return 0; }

これをmingw-gccで正常にコンパイルできます。

 $ gcc test.c -o test
 $ ./test
 Hello world!

Clang + mingwを使用して正常にコンパイルすることもできます。

 $ clang test.c -o test -target
 $ ./test
 Hello world!

ただし、プログラム(float.hを含む)に小さな変更を加えると、gccでコンパイルは続行されますが、clangでコンパイルされなくなります。

#include <stdio.h>
#include <float.h>
int main(int argc, char **argv) { printf("Hello world!\n"); return 0; }
 $ gcc test.c -o test
 $ ./test
 Hello world!

 $ clang test.c -o test -target x86_64-pc-windows-gnu
 In file included from test.c:2:
 In file included from C:\llvm\built\lib\clang\8.0.0\include\float.h:45:
 C:\mingw64-8.1.0\x86_64-w64-mingw32\include\float.h:28:15: fatal error: 'float.h' file not found
 #include_next <float.h>
               ^~~~~~~~~
 1 error generated.

Clangの設定に問題があるか、コマンドライン引数が不足していますか?少しぐらついてみると、float.hをインクルードするときのパスの順序が重要であるように見えますが、これはすべてclangドライバーによって内部的に処理されることになっています。

16
Harry Wagstaff

この問題をいずれかのclang開発者に渡すことをお勧めします。

以前のリリース7.1.0のfloat.hを8.0.0のfloat.hと比較すると、わずかな違いしかありません。私が最初に尋ねるのは、ヘッダーガードを__FLOAT_Hから__CLANG_FLOAT_Hに変更する理由です。

8.0.0ヘッダーガードの変更を試して、何が起こるかを確認してください。

編集:もう少し検索しました。 MinGW-w64開発者は、2018年8月以降のこの変更を認識しています。MinGWインストールに https://sourceforge.net/p/mingw-w64/mailman/message/36386405/ からパッチを追加または修正してください。それを整理することがあります。

編集2:私がしばらく使用していないものは、MinGWのMSYS2インストールです。これはg ++。exe(Rev1、Built by MSYS2プロジェクト)8.2.1 20181214を示しています。これには、float.hの27行目にパッチが適用されています。

#if !defined(_FLOAT_H___) && !defined(__FLOAT_H) && !defined(__CLANG_FLOAT_H)

MinGW-w64 8.1.0のソースフォージダウンロードでは#if !defined(_FLOAT_H___) && !defined(__FLOAT_H)と表示されますが

注:また、MSYS2はローリングリリースアップデートを使用していると確信していますが、それを確認する必要があります。それは私が定期的に使用するものではありません。

Edit3:MSYS2はローリングリリースのようです。最新バージョンは9.1.0です。

スタンドアロンのMinGWが必要でない限り、私の意見では、MSYS2に最新のアップデートを適用します。古いバージョンの1つにパッチを適用するだけでも機能する場合がありますが、他にも問題が発生する可能性があります。スタンドアロンバージョンが必要な場合は、ソースから直接MinGW-w64をビルドするのが唯一のオプションだと思います。

注:上記のディスカッションにコメントを追加しましたが、新しいことはまだ許可されていません。

編集4:注:サードパーティのマルチライブラリツールチェーンは、デフォルトでsjlj例外を使用してビルドされている可能性が高いです。確認方法は https://stackoverflow.com/a/17968530/11879567 を参照してください。

編集5:うまくいけば、これが私が行う最後の編集です。 MinGW-w64フォーラムをチェックして、次の公式リリースの期日を誰かが尋ねたかどうかを確認してください。 8.2がいつリリースされるのかと尋ねる人に出会いました。 MinGW-w64の新しいリリースが非常に長く待たれるという印象を受けました。 https://sourceforge.net/p/mingw-w64/discussion/723797/thread/ea9a5b00fb/

サイドノート:私がClangを扱うときにわかったように、MinGWまたはVisual Studioのいずれかで、常に何らかの問題が発生します。

1
dawlane