Всем привет.
Если вдруг кто не знает,
mingw-builds - это проект предоставляющие сборки компилятора
GCC для Windows платформы, т.е. MinGW.
Итак...
До сих пор, проект предоставлял сборки с двумя типами реализации исключений: 1)
dwarf, 2)
sjlj(
1,
2).
Сборки использующие dwarf, будут исключены из последующих сборок проекта
mingw-builds.
Связанно это с двумя причинами:
1. dwarf, для windows ОС - это инородный способ реализации исключений, он не может работать правильно в windows из-за того, что реализация как С++ так и Си(
SEH) исключений в компиляторе MSVC использует SJLJ. В связи с этим, возникают трудноуловимые ошибки связанные с разрушением стека и пробросом/ловлей исключений между .dll модулей. Мнение разработчиков CRT для MinGW(mingw-w64)
тут.
2. и вторая причина, вытекающая из первой - отсутствие реализации dwarf для windows-x86_64.
Посему, пользователям dwarf сборок придется пересобирать либы. Увы...
С этого момента, проект
mingw-builds предоставляет сборки для двух хостов: a)
i686, b)
x86_64.
Каждая такая сборка, является двухцелевым кросс-компилятором. Компилятор для
i686 хоста по умолчанию собирает для
i686 цели. Компилятор для
x86_64 хоста по умолчанию собирает для
x86_64 цели.
Для того, чтоб при помощи компилятора для
i686 хоста собрать для
x86_64 - при компиляции и линковке добавляйте флаг
-m64.
Для того, чтоб при помощи компилятора для
x86_64 хоста собрать для
i686 - при компиляции и линковке добавляйте флаг
-m32.
Разумеется, все зависимости цели должны быть собраны соответствующим образом.
Теперь о зависимостях цели от .dll модулей поставляемых в составе компилятора(libstdc++-6.dll, etc...).
Как правило, при использовании MinGW, путь к mingw/bin прописывается в PATH. Все необходимые для хоста .dll модули так же находятся в mingw/bin. По этому, проблем с выполнением полученных исполняемых файлов нет. Но при использовании кросс-компилятора все немного сложнее.
Если производится сборка при которой host==target - тут все как обычно, ибо .dll модули находятся в mingw/bin. Однако, в случаях когда host!=target, .dll модули оказываются недоступными для целевого исполняемого файла.
Для
i686 компилятора, .dll модули для
x86_64 цели располагаются в mingw/i686-w64-mingw32/lib64.
Для
x86_64 компилятора, .dll модули для
i686 цели располагаются в mingw/x86_64-w64-mingw32/lib32.
Если что не понятно - задавайте вопросы.
Сборка для
i686 уже готова. Со сборкой для
x86_64 хоста возникли некоторые сложности. На страницу проекта пока не выгружал. Хочу одновременно.
Всем спасибо.