Использование библиотеки GCC 4.4 с приложением GCC 4.8

Я пишу заявку, и я хотел бы использовать GCC 4.8 на rhel7. Моя проблема в том, что мне нужно использовать стороннюю разделяемую библиотеку, которая была построена с использованием GCC 4.4, созданной на rhel6.

1 ответ

Кто-то предложил мне создать интерфейс между моим приложением и библиотекой, используя extern "C", чтобы избежать проблем ABI при переходе от C++03 к C++11, и передавать только простые C-структуры в интерфейсе.

Это значимое предложение, так как слишком сложно сохранить совместимость ABI в интерфейсах C++.

Но они также предположили, что возможно, мне придется скопировать и связать libstdC++ и libgcc с машины rhel6, поскольку сторонняя библиотека (и мой интерфейс) построена с их использованием. Это где я запутался.

И libgcc, и libstdC++ сохраняют обратную совместимость (если только в GCC5, но это не ваш случай), поэтому сторонняя библиотека должна прекрасно работать с библиотеками RHEL7.

Учитывая, что основная версия (libName.so.major.minor.xz) libstdC++ и libgcc одинакова для rhel6 и 7, действительно ли мне нужно копировать их из rhel6 в 7?

Нет (см. Выше).

Не могу ли я построить свой интерфейс на rhel6 и просто скопировать его вместе со сторонней библиотекой lib на rhel7 (без копирования старой libstdC++/libgcc)?

Да, это будет работать.

Я имею в виду, так как материал, созданный с использованием старого libstdC++ / libgcc, должен быть совместимым с прямой совместимостью, нет?

Правильно (обычно говорят, что "новые версии стандартных библиотек обратно совместимы, т. Е. Программное обеспечение, скомпилированное со старыми библиотеками, будет продолжать работать").

Могу ли я столкнуться с проблемами (ABI)?

Если вам как-то удастся передать объект STL, созданный в одной libstdC++, в другую, у вас будут странные ошибки. Но если ваша и сторонняя библиотека имеют чистые интерфейсы C, это не должно вызывать проблем (поскольку у объектов STL нет возможности избежать их содержащих библиотек).

Если мне нужно скопировать libstdC++ и libgcc из rhel6 и связать новые и старые версии вместе - как мне это сделать? будет ли работать предложение статически связать новые версии?

Это было бы ненужным бременем.

Другие вопросы по тегам