Ответ 1
Более старые двоичные версии MinGW-w64 несовместимы с Clang 8. 0+ float.h
. Чтобы это исправить, скопируйте эту конкретную версию float.h в правильное место и используйте ее.
У меня есть простая программа, которую я могу успешно скомпилировать с помощью clang, используя MinGW C/C++ Library:
#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.
Более старые двоичные версии MinGW-w64 несовместимы с Clang 8. 0+ float.h
. Чтобы это исправить, скопируйте эту конкретную версию float.h в правильное место и используйте ее.
Я думаю, что было бы целесообразно передать эту проблему одному из разработчиков Clang.
Сравнение предыдущего выпуска 7.1.0 float.h с тем, что в 8.0.0, показывает только несколько различий. Первое, о чем я сам хотел бы спросить, - почему они меняют защиту заголовка с __FLOAT_H на __CLANG_FLOAT_H.
Попробуйте изменить защиту заголовка 8.0.0 и посмотрите, что произойдет.
Изменение: сделал немного больше поиска. Разработчики MinGW-w64 знают об этом изменении с августа 2018 года. Добавление или адаптация патча из https://sourceforge.net/p/mingw-w64/mailman/message/36386405/ к вашей установке MinGW может решить его.
Редактировать 2: Что-то, что я не использовал некоторое время, это моя установка MSYS2 MinGW. Он показывает g++.exe(Rev1, построен в рамках проекта MSYS2) 8.2.1 20181214. У него есть исправление для строки 27 файла float.h.
#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 с последними обновлениями. Попытка исправить одну из старых версий может сработать, но могут быть и другие проблемы, которые я покажу сами. Если вам нужна отдельная версия, то я думаю, что единственным вариантом будет сборка MinGW-w64 непосредственно из исходного кода.
ПРИМЕЧАНИЕ. Я бы добавил комментарии к вышеупомянутому обсуждению, но, будучи новичком, мне пока не разрешено.
ОБНОВЛЕНИЕ 4: ПРИМЕЧАНИЕ: сторонние мультибиблиотечные цепочки более чем вероятно созданы с исключениями sjlj по умолчанию. См. fooobar.com/info/309831/... о том, как проверить.
Изменить 5: Надеюсь, это последнее редактирование, которое я сделаю. Зайдите на форумы MinGW-w64, чтобы узнать, спрашивал ли кто-нибудь, когда выйдет следующий официальный релиз. Я встретил кого-то, кто спрашивал, когда выйдет 8.2. У меня сложилось впечатление, что вы можете очень долго ждать любой новой версии MinGW-w64. https://sourceforge.net/p/mingw-w64/discussion/723797/thread/ea9a5b00fb/
ПРИМЕЧАНИЕ: Как я выяснил при работе с Clang, у вас всегда будет одна или другая проблема, будь то MinGW или Visual Studio.