Как мне скомпилировать код с использованием Clang с библиотекой MinGW C/C++? (Особая проблема с 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.

Ответ 1

Более старые двоичные версии MinGW-w64 несовместимы с Clang 8. 0+ float.h. Чтобы это исправить, скопируйте эту конкретную версию float.h в правильное место и используйте ее.

Ответ 2

Я думаю, что было бы целесообразно передать эту проблему одному из разработчиков 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.