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

Управление внешними библиотеками (например, boost) при переходе на С++ 11

Я хочу переместить мой текущий проект на С++ 11. Код компилируется с помощью clang++ -std = С++ 0x. Это легкая часть:-). Трудная часть связана с внешними библиотеками. Нельзя полагаться на связывание одного объекта С++ 11 с внешними библиотеками, которые не были скомпилированы с помощью С++ 11 (см. http://gcc.gnu.org/wiki/Cxx11AbiCompatibility). Например, Boost, безусловно, нуждается в реорганизации (Почему не может связываться с libС++ в режиме С++ 0x, этот пример boost:: program_options?). У меня есть источник для всех внешних библиотек, которые я использую, поэтому я могу (с некоторой болью) теоретически перестроить эти библиотеки с С++ 11. Тем не менее, это все еще оставляет мне некоторые проблемы:

Разработка в смешанной среде С++ 03/С++ 11: У меня есть несколько старых проектов с использованием С++ 03, которые требуют периодического обслуживания. Конечно, я хочу связать их с существующими версиями внешних библиотек. Но для моих текущих (и новых) проектов я хочу связать с моими перестроенными версиями библиотек С++ 11. Как мне организовать среду разработки (в настоящее время Ubuntu 12.04 и Mac OS X 10.7), чтобы справиться с этим?

Я предполагаю, что эта проблема столкнется со многими разработчиками. Это не исчезнет, ​​но я не нашел рекомендуемого и общепринятого решения.

Развертывание. В настоящее время я развертываю серверы Ubuntu 12.04 LTS в облаке. Опыт позволяет зависеть (по возможности) от стандартных пакетов (например, libboost), доступных с дистрибутивом linux. Если я переведу свой текущий проект на С++ 11, я понимаю, что мне придется создавать собственные версии внешних библиотек, которые я использую. Я предполагаю, что в какой-то момент это изменится, и их будут "стандартными" версиями пакетов библиотек с совместимостью на С++ 11. Кто-нибудь есть идеи, когда можно было ожидать, что это произойдет? Предположительно, это также потребует стандартного решения проблемы, упомянутой выше, - одновременное существование С++ 03 libs и С++ 11 libs на одной платформе.

Я надеюсь, что я пропустил что-то основное, чтобы эти воспринимаемые проблемы исчезли в нужной информации! Я слишком скоро перейду на С++ 11?

Обновление (2013-09-11): Связанное обсуждение для macports: https://lists.macosforge.org/pipermail/macports-users/2013-September/033383.html

4b9b3361

Ответ 1

Вы должны использовать свою инструментальную цепочку configure (например, autotools) для "правильной" настройки вашей сборки для целевого развертывания. Ваши тесты конфигурации должны проверять совместимые с ABI С++ 11 двоичные файлы и давать указания компоновщику использовать их сначала, если они обнаружены. Если нет, необязательно сбой или возврат к сборке С++ 03.

Что касается библиотек С++ 11 3rd part, установленных в отдельном дереве параллельных каталогов, это не является абсолютно необходимым. Редактирование версий библиотеки существует в течение длительного времени и позволяет размещать разные версии бок о бок в системе или где угодно, снова на основе конфигурации.

Это может показаться беспорядочным, но настраиваемые инструментальные цепочки были разработаны для обработки этих беспорядков.