2016-12-20 5 views
1

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

+0

Основная проблема заключается в следующем: что произойдет, если вы согласитесь с 'new int' от 4.4.8 с' delete' от 4.8.5 или наоборот? Использование 'extern 'C" 'на интерфейсе не является магическим исправлением, потому что' int * 'разрешено в C. – MSalters

ответ

1

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

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

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

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

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

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

Брус Я строю свой интерфейс на RHEL6, и просто скопировать его вместе с 3-й партии Lib к rhel7 (без копирования старой libstdC++/libgcc)?

Да, это сработает.

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

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

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

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

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

Это было бы лишней нагрузкой.

Смежные вопросы