Я работаю над redhat 5.2 над проектом, который охватывает несколько разрозненных организаций. Каждая организация поставляет библиотеки, скомпилированные с различными версиями g++. В настоящее время эти версии включают 4.1.1, 4.1.2 и 4.3.1. Я пытаюсь связать все библиотеки вместе в исполняемый файл, используя 4.1.2. Какие проблемы, если таковые имеются, я могу ожидать, делая это? Кроме того, есть ли способ определить, для какого ABI создается каждая версия компилятора?
Смешивание библиотек из разных компиляторов C++
- Сначала я подумал, что вы имеете в виду Red Hat 5.2 (Apollo), которому больше десяти лет. :) 21.05.2009
Ответы:
В этом документе политики ABI подробно описана совместимость между различными версиями ABI. В соответствии с этим библиотека libstdc++.so
должна быть совместима, и в последний раз gcc нарушал бинарную совместимость в версии 3.4. Вы должны быть в порядке.
GCC (сборник компиляторов GNU) определяет номера версий и совместимость.
Библиотеки G++ между 4.1.1 и 4.1.2 должны быть совместимы; ссылка на новейшее.
Библиотеки G++ версий 4.1.x и 4.2.x несовместимы; вам нужно что-то перекомпилировать.
Библиотеки G++ версий 3.x.y и 4.p.q несовместимы; вам нужно что-то перекомпилировать.
В вашем сценарии код, созданный с помощью 4.3.1, несовместим с остальными.
Либо вам придется пересобрать код, который в настоящее время скомпилирован с 4.3.x, чтобы он использовал 4.1.x, либо вам нужно перекомпилировать код, который в настоящее время скомпилирован с 4.1.x, чтобы он вместо этого использовал 4.3.x.
Может быть, проще связать исполняемый файл со статической связью... получается большой двоичный файл, но он работает на всех платформах.
Не должно быть проблем с связыванием библиотек, созданных из разных версий g++, если они не указаны на веб-сайте g++. Однако важно, чтобы эти библиотеки были построены на той же платформе, что и в вашем случае, это RedHat 5.2. Библиотека, созданная для платформы, отличной от Linux/Redhat (скажем, Solaris), не будет связана с вашим exe.
IIRC, есть библиотека совместимости C++, которая используется именно для этого. Кажется, это называется libstdc++-compat.