Насколько я понял, невозможно связать библиотеки, которые используют разные версии двоичного интерфейса приложения GCC (ABI). Существуют ли изменения в ABI для каждой версии GCC? Можно ли связать библиотеку, построенную с 4.3.1, если я использую, скажем, GCC 4.3.2? Есть ли какая-то матрица, в которой перечислены все способы комбинирования версий GCC?
Совместимость GCC ABI
Ответ 1
Официальная страница ABI указывает на ABIcheck. Этот инструмент может делать то, что вы хотите.
Ответ 2
Так как gcc-3.4.0, ABI является передовым. И.Е. библиотека, созданная с использованием более ранней версии, может быть связана с более новой версией, и она должна работать (обратное не работает). Очевидно, что могут быть ошибки, но в документации есть только один: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33678
Ответ 3
Ух, yikes.
Как вы можете определить, какой gcc составил данный двоичный файл? Здесь
уведомление о смерти от gcc-4.7.2-1-mingw32.README.txt:
Уведомление о двоичной несовместимости!
C и С++ ABI изменены в GCC 4.7.0, что означает, что вы вообще не можете свяжите вместе двоичные файлы, скомпилированные с этой версией компилятора и с версиями до GCC 4.7.0. В частности:
-
Опция -mms-bitfields включена по умолчанию, что означает макет битового поля следует за соглашением компилятора Microsoft.
-
Функции класса С++ теперь следуют за соглашением __thiscall.
-
Теперь компилятор предполагает, что вызывающий пользователь выталкивает стек для неявные аргументы, указывающие на совокупное возвращаемое значение. Это влияет на функции возвращают структуры по значению, такие как сложный математический тип.