Создание совместимых библиотек

Компилятор GCC 4.0 поставляет с версией 6.0.3 динамического времени выполнения C++. Будущие вспомогательные версии библиотеки, как гарантируют, сохранят совместимость на уровне двоичных кодов с версией 6.0.3; однако, основные версии, как гарантируют, не будут совместимы, и разработчики должны предположить, что будущий выпуск компилятора будет включать несовместимую версию libstdc++.dylib.

Если Вы распределяете динамические совместно используемые библиотеки, использующие динамическое время выполнения C++, изменения в том времени выполнения могли потенциально повредить клиенты Вашей библиотеки. Например, если интерфейс Вашей библиотеки включает типы или классы, определенные динамическим временем выполнения C++, это может произойти. Следующие разделы объясняют способы остаться совместимыми между основными обновлениями к динамическому времени выполнения C++.

Предотвращение libstdc ++ в Интерфейсах Библиотеки

Поскольку любой компонент динамического времени выполнения C++ может измениться между основными версиями, Ваши собственные динамические совместно используемые библиотеки должны избегать использования классов, шаблонов и структур динамического времени выполнения C++ в их экспортируемых интерфейсах. Размер и расположение стандартных классов C++ могут измениться между различными версиями динамической библиотеки стандарта C++. Если это произойдет и Ваши интерфейсы экспорта библиотеки, полагающиеся на текущую информацию о классе, то клиенты Вашей библиотеки повредят и потребуют перекомпиляции с обновленной версией Вашей библиотеки.

Для любых символов Ваша библиотека экспортирует в клиенты, необходимо соблюсти эти правила.

Следует иметь в виду, что запреты на использование динамических классов среды выполнения C++ применяются только к Вашим экспортируемым символам. Во внутренней реализации Вашей библиотеки Вы свободны использовать классы libstdc++ как Вы выбираете. Также имейте в виду, что эти правила состоят в том, чтобы препятствовать тому, чтобы клиенты Вашей библиотеки повредились, когда обновляется динамическое время выполнения C++. Ваша собственная библиотека могла бы все еще потребовать перекомпиляции.

Помните, что экспортируемый интерфейс динамической совместно используемой библиотеки состоит из всех общедоступных символов, не только классов и функций, объявленных в заголовочных файлах библиотеки. В частности шаблонные инстанцирования общедоступны по умолчанию. Так, если Вы инстанцируете шаблона с объявлением std::vector<my_type>, Ваша библиотека представляет общедоступный экземпляр std::vector и испытает проблемы с любыми существенными изменениями версии к динамическому времени выполнения C++.

Поскольку Вы создаете свою библиотеку, необходимо помнить, из которых взаимодействует через интерфейс, Вы хотите обнародовать и отметить их соответственно. Для получения информации о том, как ограничить экспортируемые символы в Вашей библиотеке, посмотрите Видимость Символа Управления.

Ограничение объема обратных вызовов

В определенных случаях приложение C++ может код поставки, использующийся самим динамическим временем выполнения C++. Когда приложение заменяет глобальную переменную, самый соответствующий пример этого - new и delete операторы. Более редкие примеры включают потоковые обратные вызовы I/O, определенные через std::ios_base::register_callback и определяемые пользователем фасеты пропитаны в глобальную локаль.

Если Вы реализуете свою собственную версию operator new, та версия используется всеми другими библиотеками, соединяющимися с той же версией libstdc++.dylib. Если это не то, что Вы предназначили со своей реализацией, необходимо отметить версию метода с __private_extern__ тег для предотвращения его от того, чтобы когда-нибудь быть замеченным другими библиотеками.

Для получения дополнительной информации об управлении видимостью символов в Ваших библиотеках посмотрите Видимость Символа Управления.