g ++ всегда обратно совместим с & quot; более старым & quot; статические библиотеки?

У меня есть несколько статических библиотек, владельцем которых я не являюсь, скомпилированных со старой версией g ++ (4.3.2, c ++ 11 / c ++ 0x не активирован).

Когда я компилирую свой код с помощью g ++ 4.6 (без c ++ 11) и связываю его (используя g ++ 4.6) с этими
статические библиотеки, это нормально связывает, и я не вижу никаких проблем во время выполнения (хотя не проверял все).
поэтому я склонен думать, что прямая совместимость в порядке.

Теперь я хотел бы скомпилировать мой код с помощью gcc 4.8 с помощью c ++ 11 и по-прежнему связывать его с теми же не перекомпилированными статическими библиотеками. Будет ли еще работать?

Другими словами,
Изменения ABI в g ++ являются проблемой только для прямой совместимости связей или могут возникнуть проблемы обратной совместимости?

Благодарю.

14

Решение

Код G ++ ABI для C ++ 98 обратно совместим, вплоть до GCC 3.4

Так что, если вы скомпилируете и скомпонуете свой окончательный исполняемый файл с GCC 4.8, вы можете связать его с объектами и библиотеками, созданными из чего-либо от GCC 3.4 до 4.8 (но не новее)

ABI C ++ 11 такой же, как ABI C ++ 98, и стандартные типы библиотек, общие для C ++ 98 и C ++ 11, имеют одинаковые определения, (игнорируя GCC 4.7.0 и GCC 4.7.1, которые имели несовместимость ABI в std::pair а также std::list при использовании C ++ 11, которые были исправлены в 4.7.2 и более поздних версиях) так что вы можете связать код C ++ 98 и C ++ 11 вместе (если код C ++ 11 не был собран с GCC 4.7.0 или 4.7.1)

тем не мение некоторые типы библиотек C ++ 11 еще не стабильны и меняются между выпусками, например, потому что они были сначала отправлены до окончательного стандарта C ++ 11 и должны были быть изменены, чтобы соответствовать окончательным правилам. Поэтому не обязательно безопасно смешивать код C ++ 11, созданный с GCC 4.6, и код C ++ 11, созданный с GCC 4.8

Для вашего случая, когда весь код C ++ 11 построен с GCC 4.8, все будет в порядке. Если вы обновляете компилятор, вы должны пересобрать весь код C ++ 11 с более новым GCC, чтобы быть безопасным. (Вам не нужно перестраивать код C ++ 98 / C ++ 03)

22

Другие решения

Целью стандарта C ++ 11 является обеспечение обратной совместимости, как и поставщиков компиляторов. Пока библиотека не использует ничего, что «нарушает» стандарт C ++ 11, сам формат библиотеки должен быть таким же.

Увидеть этот для изменений, внесенных в C ++ 11.

Итак, предполагая, что код, который вы используете для вызова библиотеки (включая заголовки), у вас все будет хорошо.

0