У меня есть несколько статических библиотек, владельцем которых я не являюсь, скомпилированных со старой версией g ++ (4.3.2, c ++ 11 / c ++ 0x не активирован).
Когда я компилирую свой код с помощью g ++ 4.6 (без c ++ 11) и связываю его (используя g ++ 4.6) с этими
статические библиотеки, это нормально связывает, и я не вижу никаких проблем во время выполнения (хотя не проверял все).
поэтому я склонен думать, что прямая совместимость в порядке.
Теперь я хотел бы скомпилировать мой код с помощью gcc 4.8 с помощью c ++ 11 и по-прежнему связывать его с теми же не перекомпилированными статическими библиотеками. Будет ли еще работать?
Другими словами,
Изменения ABI в g ++ являются проблемой только для прямой совместимости связей или могут возникнуть проблемы обратной совместимости?
Благодарю.
Код 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)
Целью стандарта C ++ 11 является обеспечение обратной совместимости, как и поставщиков компиляторов. Пока библиотека не использует ничего, что «нарушает» стандарт C ++ 11, сам формат библиотеки должен быть таким же.
Увидеть этот для изменений, внесенных в C ++ 11.
Итак, предполагая, что код, который вы используете для вызова библиотеки (включая заголовки), у вас все будет хорошо.