Использование библиотеки 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 и связать новые и старые версии вместе - как мне это сделать? будет ли работать предложение статически связать новые версии?
Это было бы ненужным бременем.