Ответ 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С++, и поэтому конфликт никогда не возникает.