G++ всегда обратная совместимость со старыми статическими библиотеками? - программирование
Подтвердить что ты не робот

G++ всегда обратная совместимость со старыми статическими библиотеками?

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

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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