Создание совместимых библиотек
Компилятор GCC 4.0 поставляет с версией 6.0.3 динамического времени выполнения C++. Будущие вспомогательные версии библиотеки, как гарантируют, сохранят совместимость на уровне двоичных кодов с версией 6.0.3; однако, основные версии, как гарантируют, не будут совместимы, и разработчики должны предположить, что будущий выпуск компилятора будет включать несовместимую версию libstdc++.dylib
.
Если Вы распределяете динамические совместно используемые библиотеки, использующие динамическое время выполнения C++, изменения в том времени выполнения могли потенциально повредить клиенты Вашей библиотеки. Например, если интерфейс Вашей библиотеки включает типы или классы, определенные динамическим временем выполнения C++, это может произойти. Следующие разделы объясняют способы остаться совместимыми между основными обновлениями к динамическому времени выполнения C++.
Предотвращение libstdc ++ в Интерфейсах Библиотеки
Поскольку любой компонент динамического времени выполнения C++ может измениться между основными версиями, Ваши собственные динамические совместно используемые библиотеки должны избегать использования классов, шаблонов и структур динамического времени выполнения C++ в их экспортируемых интерфейсах. Размер и расположение стандартных классов C++ могут измениться между различными версиями динамической библиотеки стандарта C++. Если это произойдет и Ваши интерфейсы экспорта библиотеки, полагающиеся на текущую информацию о классе, то клиенты Вашей библиотеки повредят и потребуют перекомпиляции с обновленной версией Вашей библиотеки.
Для любых символов Ваша библиотека экспортирует в клиенты, необходимо соблюсти эти правила.
Избегите наследоваться от классов в динамической библиотеке стандарта C++, такой как
std::ostream
.В Вашем определении класса избегите задействованных переменных (даже члены парламента, не занимающие официального поста), чей тип является классом, определенным динамическим временем выполнения C++. Например, не включайте задействованные переменные типа
std::auto_ptr
.Избегайте использования классов, определенных в динамическое время выполнения C++ как параметры или возвращаемые значения функций или методов.
Если Ваша функция или метод выдают исключения, уверены, что Ваши классы исключений не происходят из динамических классов среды выполнения C++, такой как
std::runtime_error
Следует иметь в виду, что запреты на использование динамических классов среды выполнения 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__
тег для предотвращения его от того, чтобы когда-нибудь быть замеченным другими библиотеками.
Для получения дополнительной информации об управлении видимостью символов в Ваших библиотеках посмотрите Видимость Символа Управления.