Подтвердить что ты не робот

Риски разных версий GCC в режиме соединения/времени выполнения?

Я использую компилятор Intel С++, который на Linux опирается на предоставленные GNU libc.so и libstdС++, поэтому.

Вот моя проблема. Чтобы иметь доступ к некоторым из новейших возможностей С++ 11, мне нужно использовать libstdС++, который поставляется с GCC 4.7 или выше. Но я застрял, используя CentOS 6.4.

В CentOS 6.4 исходная версия GCC равна 4.4. Но используя RedHat-вещь под названием "SCL" и пакет с именем "devtoolset-1.1", я могу установить GCC 4.7 под "/opt".

Я установил, что использую GCC 4.7 в соответствии с вышеизложенным способом, я могу использовать новые возможности С++ 11.

Итак, вот мой вопрос: если пользователь запускает мою программу только с версиями libc.so/libstdС++ GCC 4.4, поэтому в пути к библиотеке существует риск того, что моя программа будет иметь ошибки из-за некоторого несоответствия между 4.4 и 4.7 версий этих библиотек?

Если есть потенциальная проблема, могу ли я ее обойти, статически связав в GCC версии 4.7 libc и libstdС++? Или это зависит от других проблем, если/когда другие библиотеки, которые мой код динамически загружает, забирают старый libc/libstdС++, поставляемый общесистемным пакетом GCC 4.4?

4b9b3361

Ответ 1

Как отметил Praetorian в комментариях ниже, использование devtoolset фактически решает проблему, которую я изначально описал в этом ответе. Я исправил ответ.

существует ли риск того, что моя программа будет иметь ошибки из-за некоторого несоответствия между версиями этих библиотек 4.4 и 4.7?

Да. Связывание с более новым libstdС++, поэтому, а затем попытаться запустить против и старше, 100% не поддерживается. Если какой-либо объект в вашей программе или какие-либо библиотеки, которые он использует, скомпилирован с GCC 4.7 и связан с libstdС++, поэтому из 4.7 вам нужно использовать libstdС++, поэтому от 4.7 (или новее) во время выполнения. Вероятно, он даже не запустится, но если это произойдет, могут быть тихие ошибки из-за несовместимости. Но это не проблема в вашем случае, потому что вы не связываетесь с GCC 4.7 libstdС++, поэтому см. Ниже.

Я могу обойти его, статически связав в GCC версии 4.7 libc и libstdС++?

1) Вам нужно будет сделать это только для libstdС++, потому что нет такой вещи, как "GCC 4.7 версия libc". Glibc - полностью отдельный проект от GCC. Когда вы используете GCC 4.7, вы не используете другой libc, вы все еще используете системный libc из CentOS 6.4. Имейте в виду, что статическая ссылка glibc настоятельно рекомендуется разработчикам glibc, а некоторые функции glibc не будут работать при статической привязке.)

2) Статическая привязка libstdС++ будет работать вокруг проблемы, но вам не нужно, потому что это то, что Red Hat Developer Toolset ( devtoolset) для вас все равно. Весь смысл devtoolset заключается в том, что он позволяет использовать новый GCC и новый libstdС++, но без создания каких-либо зависимостей во времени выполнения от новой библиотеки libstdС++. Скомпилированным исполняемым файлам нужна только системная версия libstdС++, поэтому она всегда присутствует в RHEL/CentOS, даже системы без установленного devtoolset. (Что делает devtoolset, это пакет всех новых функций libstdС++ в статической библиотеке, называемый libstdc++_nonshared.a, так что все части, которые не присутствуют в системе libstdС++, поэтому статически связаны, а все остальное исходит из системы libstdС++..

Если вы не использовали devtoolset, тогда другой вариант вместо статической привязки libstdС++ должен был отправить новый libstdС++, поэтому с вашим кодом и убедиться, что он найден первым (например, путем связывания вашего кода с RPATH, который ссылается на новый libstdС++. так). Но с devtoolset это не нужно.

Или это настраивается для других проблем, если/когда другие библиотеки, которые мой код динамически загружает, берут старый libc/libstdС++, поставляемый общесистемным пакетом GCC 4.4?

Не будет таких проблем при использовании devtoolset, потому что вы всегда используете старый libstdС++, и поэтому конфликт никогда не возникает.