Совместимость MS и Non-MS C ++ - PullRequest
       1

Совместимость MS и Non-MS C ++

4 голосов
/ 19 августа 2011

Думал об использовании MinGW в качестве альтернативы VC ++ в Windows, но беспокоюсь о проблемах совместимости.Я думаю с точки зрения поведения, производительности в Windows (любой шанс, что скомпилированный MinGW EXE может сработать).Кроме того, с точки зрения вызова Windows API, сторонних DLL, генераторов и использования совместимых статических библиотек и других проблем, возникающих при смешивании частей одного приложения с двумя компиляторами.

Ответы [ 2 ]

9 голосов
/ 19 августа 2011

Во-первых, MinGW - не компилятор, а среда, он связан с gcc.

Если вы думаете об использовании gcc для компиляции кода и вызова его в Windows API, все в порядке, так как это C; но для C ++ DLL, сгенерированных MSVC, у вас может быть резкий пробужденный вызов.

Основная проблема заключается в том, что в C ++ каждый компилятор имеет свое собственное преобразование имен (или, в более общем случае, ABI) и собственную стандартную библиотеку. Вы не можете смешивать два разных ABI или две разные стандартные библиотеки. Конец истории.

Clang пытается быть максимально совместимым с MSVC, но пока не существует.

  • Он успешно анализирует стандартную библиотеку MSVC (2008 и 2010), а также заголовки MFC, хотя я не уверен в аспекте CodeGen.
  • Существует проблема ABI в отношении структурированных исключений, я думаю , что она связана с патентными проблемами, препятствующими их включению в Clang, но вполне может ошибаться.

Поэтому вы должны выбрать один компилятор C ++ и придерживаться его.

Очевидно, что вы также можете просто выполнить кросс-DLL-связь в C, чтобы обойти эту проблему.

РЕДАКТИРОВАТЬ : разъяснение Керрека.

4 голосов
/ 19 августа 2011

Можно скомпилировать большое количество кода C ++, разработанного для VC ++, с помощью цепочки инструментов MinGW; однако легкость выполнения этой задачи в значительной степени зависит от того, насколько C ++ соответствует стандартам код.

Если в коде C ++ используются расширения VC ++, такие как __uuidof, вам потребуется переписать эти части.

Вы не сможете скомпилировать код ATL & MFC с MinGW, поскольку заголовки ATL и MFC используют несколько расширений VC ++ и зависят от поведения, специфичного для VC ++:

Вы не сможете использовать сгенерированные VC ++ файлы LIB, поэтому вы не можете использовать компоновщик MinGW ld для связывания статических библиотек без перекомпиляции кода библиотеки в виде архива MinGW A.

Вы можете связать с DLL с закрытым исходным кодом; однако вам нужно будет экспортировать символы DLL в виде DEF файла и использовать dlltool для создания соответствующего A архива ( аналогично файлу VC ++ LIB для каждой DLL).

Включение MinGW проекта w32api в основном означает, что код, использующий Windows C API, будет хорошо компилироваться, хотя некоторые из новых функций могут быть недоступны сразу. Например, несколько месяцев назад у меня были проблемы с компиляцией кода, в котором использовались некоторые «безопасные» функции (с суффиксом _s), но я решил эту проблему, экспортировав символы DLL в виде DEF, подготовка актуального A архива и написание предварительных деклараций.

В некоторых случаях вам потребуется настроить аргументы препроцессора MinGW, cpp, чтобы убедиться, что все заголовочные файлы включены правильно и что определенные макросы предопределены правильно.

Я рекомендую просто попробовать. Вы определенно столкнетесь с проблемами, но обычно вы можете найти решение каждой из них, выполнив поиск в Интернете или спросив кого-то. Если по какой-либо другой причине вам следует попробовать его, чтобы узнать больше о C ++, различиях между компиляторами и о том, что такое код, соответствующий стандартам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...