микширующий компилятор - PullRequest
8 голосов
/ 05 июля 2011

Мне интересно, можно ли связать программу на c ++, скомпилированную с gcc4.2, с общей библиотекой c ++, скомпилированной в более поздней версии, например, gcc4.5.

IЯ пытался это сделать, но столкнулся с некоторыми другими проблемами.При компиляции разделяемой библиотеки gcc5.3 я получаю сообщение:

* "malloc: ошибка для объекта 0x7fff707d2500: освобожденный указатель не выделен, установите точку останова в malloc_error_break для отладки" *.

Если я пытаюсь скомпилировать разделяемую библиотеку с помощью gcc4.6, я получаю очень странное поведение.Класс std :: stringstream работает неправильно.Полученная строка пуста после записи в поток.

Возможно ли это сделать?Или я пытаюсь сделать что-то невозможное?Я надеялся, что это возможно, поскольку я динамически связываю библиотеку.Кстати, я работаю на MacOSX.

BR

Ответы [ 2 ]

5 голосов
/ 05 июля 2011

Начиная с gcc 3.0, g ++ следует за ABI Itanium, поэтому в теории не должно быть никаких проблем. Однако g ++ 4.2 имеет CXXABI_1.3.1, тогда как g ++ 4.5 имеет CXXABI_1.3.4 (см. здесь ). Поэтому я буду осторожен. Никто не поднимает номера ревизий, если нет различий.

Кроме того, glibc ++ прошел 5 ревизий между этими версиями, что может быть одной из причин того, почему вы std::stringstream делаете забавные вещи.

Наконец, существует множество параметров конфигурации (таких как, например, создание строк полностью динамическими или нет), которые напрямую влияют на поведение и совместимость стандартной библиотеки. Учитывая две (случайные, неизвестные) сборки, вы даже не можете знать, что они имеют одинаковые параметры конфигурации.

4 голосов
/ 05 июля 2011

По моему опыту совместимость ABI означает, что библиотеки C ++ могут связываться друг с другом без проблем.

Однако, поскольку C ++ использует так много встроенных функций, это не значит много.

Если в стандартной библиотеке C ++ используются все встроенные функции или все функции библиотеки, вы можете использовать код, скомпилированный с более старыми версиями GCC с более новыми версиями.

Но это не так.Библиотека смешивает встроенный и внешний библиотечный код.Это означает, что если что-то изменилось в std :: string, или std :: vector, или locales или что-то еще, то встроенный код из старого GCC не синхронизирован с библиотечным кодом, связанным с новым GCC.

...