Важно ли знать, каким компилятором генерируется конкретный двоичный файл в C ++? - PullRequest
1 голос
/ 31 октября 2019

Я хочу знать, важно ли знать, какой компилятор использовался для компиляции конкретной библиотеки в C ++? Потому что я слышал о совместимости с ABI, и мне любопытно узнать, имеет ли это значение или нет!

Например, могу ли я загрузить двоичные файлы OpenCV (включая dll и libs) для Windows, которые были скомпилированы с MSVC, и использовать их вдругой код, который скомпилирован с MinGW?

1 Ответ

5 голосов
/ 31 октября 2019

Это зависит от:

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

Если библиотека предоставляет только «плоский» интерфейс на основе C, даже если она написана внутри на C ++, ей нужен толькочтобы соответствовать C ABI компилятора, который использует пользователь библиотеки. C ABI обычно определяется платформой и является общим для компиляторов.

Обратите внимание, что «плоский» интерфейс может быть «преобразован» в интерфейс на основе классов C ++ с использованием классов «обертки», определенных в заголовках. В этом случае, пока бинарный файл библиотеки предоставляет только C-совместимые функциональные возможности, он все равно будет зависеть только от C ABI.

Кроме того, только в Windows есть функциональность, называемая "COM"который обеспечивает стандартный ABI, позволяющий программам использовать объекты, написанные с использованием разных компиляторов и даже разных языков. Тем не менее, COM-классы не являются обычными классами C ++, и их создание и использование весьма различны.

В конкретном случае OpenCV я никогда не использовал его, но, глядя на имя файла загрузки последней версии"OpenCV-4.1.1- vc14_vc15 .exe";это указывает на то, что он содержит библиотеки для использования с компилятором Microsoft Visual C ++ версий 14 и 15 (он же Visual Studio 2015 и 2017). Если вы хотите использовать его с MinGW (который использует компилятор GCC), вам нужно будет получить неофициальную сборку или скомпилировать ее из исходного кода самостоятельно.

...