2013-04-15 4 views
2

Я новичок в C++, и теперь я борюсь с компиляцией и связыванием. Недавно я использовал cmake и переделал библиотеку (mlpack), которая использует использование Boost (Cmake does not find boost 1.51 (windows 8)).C++ windows двоичные файлы: условия, которые будут использоваться с MinGW

С первой попытки я загрузил предварительно скомпилированные двоичные файлы для окон. Это не сработало, и мне объяснили, что двоичные файлы, которые я использовал, были для MSVC, а не MinGW, поэтому проблемы. И действительно, после перекомпиляции с использованием MinGW все прошло хорошо.

Здесь я хотел бы получить интуицию, каковы будут различия между двоичными файлами для MSVC и MinGW. Я (наивно?) Думал, что двоичные файлы были специфичны для ОС/процессора. Что представляют собой двоичные файлы для MSVC, которые делают их непригодными для использования MinGW?

ответ

2

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

История с C++ совершенно другая. Наиболее известными препятствиями для надлежащей функциональной совместимости между артефактами, создаваемыми различными компиляторами C++, являются различия в name mangling и application binary interface (ABI). Это относится ко всем компиляторам C++ в целом, а не только к MinGW и MSVC. Если вы хотите узнать больше о совместимости ловушками между MSVC и MinGW в частности, я рекомендую вам прочитать следующие статьи:

  1. Interoperability of Libraries Created by Different Compiler Brands
  2. Binary-compatible C++ Interfaces
1

Быть простым.

Windows говорит French.
MinGW говорит по-английски French, German и English.
Системы Unix говорят German.


Бинарные файлы MSVC записаны в French.
Бинарные файлы MinGW записаны в FrenchAngloGerman.
Бинарные файлы UNIX написаны в German.


Windows, необходимо MinGW перевести некоторые из German и English к French, прежде чем он может понять все.


MinGW не похож на другие программы. Это в основном мини-ОС между Windows и Linux. Поэтому в большинстве случаев для правильной работы требуется модифицированная форма двоичных файлов. Тот факт, что вы разрабатываете свою программу в Windows на MinGW, не означает, что они будут работать на чистой Windows без каких-либо проблем. Вам все равно нужно отправлять или распространять библиотеки и исполняемые файлы MinGW, которые вы использовали с вашей программой.

+0

Я до сих пор путают. Означает ли это, что после компиляции для вашей системы ваши библиотеки все равно не будут использоваться всеми программами в вашей системе? Означает ли это, что вам нужно скомпилировать для каждого существующего компилятора?И вы никогда не можете загружать никакие двоичные файлы, кроме тех, которые были скомпилированы для вашего конкретного компилятора? Для языковой аналогии библиотеки для MSVC находятся на французском языке, MinGW говорит также по-французски, а окна говорят по-французски, нет? – Vince

+0

@Vince Я попытался объяснить это немного больше. Однако я думаю, что Haroogan предоставил хорошие ссылки на то, почему возникают проблемы. Вы должны проверить их. – stardust

+0

Спасибо! Просто уточнить: теперь я загрузил бинарные файлы iconv, и у меня есть папка lib, которая содержит iconv.lib ... Неразумно предположить, что привязка к этой библиотеке будет работать при компиляции других библиотек с использованием mingw? как узнать, хорошо ли эти библиотеки или нет? – Vince