Микширование библиотек из разных компиляторов C ++ - PullRequest
6 голосов
/ 19 мая 2009

Я работаю над Redhat 5.2 над проектом, который охватывает несколько разрозненных организаций. Каждая организация поставляет библиотеки, которые были скомпилированы с различными версиями g ++. В настоящее время эти версии включают в себя 4.1.1, 4.1.2 и 4.3.1. Я пытаюсь связать все библиотеки вместе в исполняемый файл, используя 4.1.2. Какие, если таковые имеются, проблемы, я могу ожидать, делая это? Кроме того, есть ли способ определить, к какому ABI относится каждая версия компилятора?

Ответы [ 5 ]

6 голосов
/ 19 мая 2009

Этот документ политики ABI описывает совместимость между различными версиями ABI. В соответствии с этим библиотека libstdc++.so должна быть совместимой, и в последний раз gcc сломал двоичную совместимость на уровне 3.4. Вы должны быть в порядке.

5 голосов
/ 19 мая 2009

GCC (GNU Compiler Collection) определяет номера версий и совместимость.

Библиотеки 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.

1 голос
/ 19 мая 2009

Может быть, проще статически связать исполняемый файл ... создает большой двоичный файл, но работает на всех платформах.

0 голосов
/ 19 мая 2009

IIRC, есть библиотека совместимости C ++, которая используется именно для этого. Я думаю, что это называется libstdc ++ - compat .

0 голосов
/ 19 мая 2009

Не должно быть проблем при связывании библиотек, созданных из разных версий g ++, если они не были перечислены на веб-сайте g ++. Важно то, что эти библиотеки должны быть собраны на одной платформе, которая в вашем случае называется redhat 5.2. Библиотека, созданная для платформы, отличной от linux / redhat (скажем, Solaris), не будет связываться с вашим exe.

...