совместимы ли двоичные файлы gcc-3 с gcc-4

У меня есть статическая библиотека, скомпилированная с помощью gcc 3.4.3. Я хотел бы использовать ее в коде, который теперь будет скомпилирован с помощью gcc-4. Я смутно читал, что двоичные файлы gcc-3 и gcc-4 несовместимы и что библиотеку необходимо будет перекомпилировать, но просто хочу получить подтверждение этого. Разве нельзя использовать библиотеку gcc-3 с gcc-4?


person Abhijith    schedule 06.05.2011    source источник
comment
gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html   -  person James    schedule 09.05.2011
comment
Вы пометили это как C++, так и C. Содержит ли библиотека код C++?   -  person Rup    schedule 09.05.2011
comment
Да, хотя и в отдельных библиотеках. Например, library1.a — это код c. library2.a - это код cpp.   -  person Abhijith    schedule 09.05.2011
comment
Почему бы вам просто не перекомпилировать и перестать беспокоиться об этом?   -  person David Heffernan    schedule 09.05.2011


Ответы (1)


Не всегда возможно заставить кого-то еще в организации или у поставщика обновить свою библиотеку до gcc 4, особенно если они отказались от нее.

Если C++: при условии, что они могут связываться, во время выполнения вы можете взорвать код шаблона стандартной библиотеки C++, который использует потоки, поскольку символы, сгенерированные g++ 4, разрешаются по сравнению с определениями, сгенерированными g++ 3.

Вы можете увидеть это предупреждение при связывании:

/usr/bin/ld: предупреждение: libstdc++.so.5, необходимый для (устаревшей статической библиотеки), может конфликтовать с libstdc++.so.6

Вот пример, в который вы можете попасть: деструктор базового класса ~basic_stringbuf() (фактически шаблон) может быть определен в вашем модуле, скомпилированном под g++ 3, который по ошибке вызывается деструктором ~basic_ostringstream() в libstdc++so.6, который вызывается скомпилированным модулем g++ 4. Ка-Бум.

Я попробовал compat-libstdc++-33, но мне не повезло.

Тем не менее, я по-прежнему связываю 32-разрядные библиотеки gcc 3 эпохи C со своими программами gcc 4.1.2 C++.

person Erik Olson    schedule 09.05.2011
comment
На самом деле это проблема с изменением имени. C не имеет этих проблем, поэтому вы можете ссылаться на старые библиотеки C. - person ; 10.05.2011
comment
Обычно. Иногда библиотеки C меняются до такой степени, что ссылка работает, а код нет. Почти всегда это происходит из-за макрорасширения getc и друзей. - person Joshua; 10.05.2011
comment
Однако, если библиотека подключена полностью статично, это не будет проблемой. - person Joshua; 10.05.2011
comment
Очень полезные комментарии, но ответ на вопрос, я думаю, варьируется, в зависимости от сценария, который можно или НЕ удастся связать со старыми библиотеками. - person Abhijith; 10.05.2011