GCC стоит использовать в Windows для замены MSVC?
=================================================

В настоящее время я разрабатываю на С++ в Windows, используя Visual Studio 2010. После официального анонса С++ 11 я начал использовать некоторые из его функций, которые уже доступны в MSVC. Но, как и ожидалось, подавляющее большинство новых изменений не поддерживается.

Я подумал, может быть, предстоящая версия Visual Studio добавит эти новые функции. Однако, прочитав [это](https://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx), похоже, что очень немного изменится.

Итак, мне интересно узнать о возможности использования GCC на Windows, а не MSVC, поскольку, похоже, он уже поддерживает подавляющее большинство С++ 11. Насколько я могу судить, это будет означать использование MinGW (я не видел других родных версий Windows GCC). Но у меня есть вопросы о том, стоит ли это попробовать:

* Может ли он использоваться в качестве замены для замены cl.exe, или это связано с большим количеством хаков и проблем с совместимостью, чтобы заставить Visual Studio использовать другой компилятор?
* Основной точкой продаж для Visual Studio, на мой взгляд, является отладчик. Это все еще можно использовать, если вы используете другой компилятор?
* Так как GCC происходит из мира * nix и не является родным для Windows, существуют ли проблемы с качеством кода при создании собственных приложений Windows, а не с использованием собственного MSVC-компилятора? (Если это имеет значение: большинство моих проектов - игры.)
* Другими словами, будет ли качество моего скомпилированного exe страдать от использования компилятора, отличного от Windows?

 

MSVC обладает огромным преимуществом при работе с IDE, которая не имеет равных под Windows, включая поддержку отладчика.

Вероятно, лучшей альтернативой MinGW будет Code:: Blocks, но есть промежутки между ними, особенно в отношении завершения кода и отладчика.

Кроме того, MSVC позволяет использовать некоторые проприетарные материалы Microsoft (MFC, ATL и, возможно, другие), которые MinGW не поддерживает, и упрощает и упрощает использование GDI + и DirectX (хотя можно сделать и с MinGW).

Cygwin, как упоминается в другом сообщении, будет иметь дополнительные зависимости и возможные проблемы с лицензией (зависимость - GPL, поэтому ваши программы тоже должны быть). MinGW не имеет такой зависимости или проблемы.

 (function(w, d, n, s, t) {
 w[n] = w[n] || [];
 w[n].push(function() {
 Ya.Context.AdvManager.render({
 blockId: "R-A-248011-3",
 renderTo: "yandex\_rtb\_R-A-248011-3",
 async: true
 });
 });
 t = d.getElementsByTagName("script")[0];
 s = d.createElement("script");
 s.src = "//an.yandex.ru/system/context.js";
 s.async = true;
 t.parentNode.insertBefore(s, t);
 })(this, this.document, "yandexContextAsyncCallbacks");

MinGW также компилируется значительно медленнее, чем MSVC (хотя предварительно скомпилированные заголовки помогают немного).

Несмотря на все это, GCC/MinGW является полностью надежным компилятором качества, который, на мой взгляд, превосходит любую доступную версию MSVC по качеству сгенерированного кода.
Это несколько менее выражено в самых последних версиях MSVC, но все еще видно. Специально для всего, что связано с SSE, внутренними и встроенными сборками, GCC уже полностью уничтожает MSVC (хотя они медленно догоняют).

Соответствие стандартам в GCC намного лучше, что может быть обоюдоострым мечом (потому что это может означать, что часть вашего кода не будет компилироваться на более подходящем компиляторе!), как и поддержка С++ 11.

MinGW дополнительно также поддерживает исключения DW2, которые полностью несовместимы с "нормальным" вкусом и занимают больше места в исполняемом файле, но с положительной стороны "практически нулевые затраты" во время выполнения.

 

Я хочу добавить некоторую информацию, потому что поле, возможно, изменилось с момента запроса.

Основной проблемой для отказа от MSVC было отсутствие хорошей среды IDE, которая безупречно интегрируется с MinGW. Visual Studio - очень мощный инструмент и был единственным игроком в Windows довольно долгое время. Тем не менее, Jetbrains выпустили предварительную версию своего нового С++ IDE CLion несколько дней назад.

 (function(w, d, n, s, t) {
 w[n] = w[n] || [];
 w[n].push(function() {
 Ya.Context.AdvManager.render({
 blockId: "R-A-248011-4",
 renderTo: "yandex\_rtb\_R-A-248011-4",
 async: true
 });
 });
 t = d.getElementsByTagName("script")[0];
 s = d.createElement("script");
 s.src = "//an.yandex.ru/system/context.js";
 s.async = true;
 t.parentNode.insertBefore(s, t);
 })(this, this.document, "yandexContextAsyncCallbacks");

Основное преимущество при работе с кросс-платформенными приложениями. В этом случае цепочка инструментов на основе GCC может значительно облегчить жизнь. Более того, CLion тесно интегрируется с CMake, что также является большим плюсом по сравнению с Visual Studio. Поэтому, на мой взгляд, стоит рассмотреть возможность перехода на MinGW сейчас.

 

Поддержка GCC С++ 11 довольно феноменальна (и вполне соответствует стандарту соответствия стандартам, теперь, когда `<regex>` был реализован).

Если вы замените свой компилятор, вам нужно убедиться, что каждая зависимость может быть построена с помощью этого нового компилятора. Они не могут быть заменяемыми плагинами (хотя [Clang работает над тем, чтобы стать таким образом](https://clang.llvm.org/docs/MSVCCompatibility.html)).

GCC - прекрасный компилятор, и он может создавать код, который имеет почти такую же производительность, если не лучше, чем MSVC. Тем не менее, отсутствуют некоторые низкоуровневые функции Windows.

Кроме того, чтобы ответить на ваши вопросы:

* Чтобы заставить VS использовать GCC в качестве компилятора, вам в значительной степени нужно полностью перейти на make файлы или пользовательские шаги сборки. Вам будет намного лучше компилироваться из командной строки и использовать CMake или что-то подобное.
* Вы не можете использовать отладчик VS для кода GCC. GCC выводит совместимую с GDB информацию об отладке, а формат отладки VS является собственностью, поэтому в ближайшее время в этой области ничего не изменится.
* Качество кода так же хорошо, как вам бы хотелось. См. Выше.
* Нет, качество вашего кода действительно увеличится, так как GCC укажет несколько принятых стандартных расширений MSVC, которые будут скрыты от вас. Все уважаемые проекты с открытым исходным кодом могут быть скомпилированы с помощью GCC.

 

Он не может использоваться в качестве замены прямого свопинга для компиляторов microsoft, для начала он имеет совершенно другой набор аргументов командной строки и специфических для компилятора опций.

Вы можете использовать MinGW или Cygwin для написания программного обеспечения, но ввести дополнительные зависимости (особенно в случае cygwin).

Одно из часто встречающихся преимуществ gcc over cl заключается в том, что gcc можно использовать с ccache для ускорения перестроек или distcc для создания с использованием нескольких других машин в качестве подчиненных компиляторов.

 

Рассмотрим компилятор Intel (или "Композитор", как они, похоже, приняли его), как еще один вариант. Я не слишком уверен, где его поддержка на С++ 11 по сравнению с MS (конечно, у нее есть lambdas), но она очень хорошо сочетается с VisualStudio (например, различные проекты в рамках решения могут использовать компиляторы Intel или MS) и там также были предприняты некоторые усилия для соответствия параметрам командной строки компилятора MS.

 

GCC и MSVC используют разные соглашения об изменении имени для С++. С++ dll, скомпилированные одним компилятором, не могут использоваться в приложениях, скомпилированных с другим. Я считаю, что это главная причина, по которой мы не видим более широкого использования gcc в Windows.