Развертывание приложений со временем выполнения C++
В большинстве ситуаций Вам никогда не придется волноваться о соединении против среды выполнения C++. При создании кода C++ GCC выбирает самую надлежащую версию библиотеки стандарта C++ и ссылок к ней. Поскольку приложения скомпилировали использование GCC 3.3, ссылок компилятора к статической библиотеке стандарта C++ libstdc++.a
. Поскольку приложения скомпилировали использование GCC 4.0, ссылок компилятора к динамической библиотеке стандарта C++ libstdc++.dylib
по умолчанию (libstdc++.a
также доступно как опция).
Следующие разделы описывают проблемы, с которыми можно встретиться при соединении против динамического времени выполнения или нового статического времени выполнения. Нет никаких известных проблем, которые стоит отметить развертыванием кода с помощью исходного статического времени выполнения C++.
Протесты для Использования новых времен выполнения C++
Следующие протесты применяются к новым статическим и динамическим временам выполнения C++.
Если Ваша программа должна работать на версиях OS X до 10.3.9, а также OS X v10.3.9 и позже, необходимо использовать компилятор GCC 3.3 и создать программу, пользующуюся исходной статической библиотекой стандарта C++ (
libstdc++.a
).Приложения, работающие на OS X v10.3.9, не должны пытаться использовать
long double
введите или любая из функций, связанных с ним. Поддержка 128-разрядногоlong double
тип не был представлен до OS X v10.4. Точно так же полная поддержкаsinl
,expl
, и все другойlong double
математические функции, определенные стандартом C, доступны только в 10,4 и позже.При переопределении
new
иdelete
операторы, Ваши переопределения будут видимы через совместно используемые границы библиотеки (широкое приложение), если Вы в частности не предпримете шаги для создания их скрытыми (такой как с (ООН) список экспорта). Даже использованиеnew
/delete
в системных платформах, в динамическое время выполнения C++ (даже если Вы только косвенно соединяетесь с ним) или в других модулях (возможно соединенный статически или динамично ко времени выполнения C++) будет использовать Ваши переопределения, если тот модуль также не переопределилnew
/delete
операторы.Если Вы не уверены, что модули кода используют того же оператора
new
иdelete
, не передавайте владение памяти через совместно используемые границы библиотеки.Многопоточные приложения, использующие стандартный поток (
std::cin
,std::cout
, и т.д.), должен явно синхронизировать их использование этих глобальных объектов, если существует шанс, что два потока могут одновременно получить доступ к одному из них. Функции, устанавливающие глобальное состояние (такой какset_terminate
,set_unexpected
, и т.д.), должен также явно синхронизироваться, если многократные потоки могут вызвать их сразу. В целом:Безопасно одновременно вызвать
const
и не -const
методы от различных потоков до отдельных объектов.Безопасно одновременно вызвать
const
методы и методы иначе гарантировали, что не изменили состояние объекта (или лишили законной силы выдающиеся ссылки и итераторы контейнера) от различных потоков до того же объекта.Это не безопасно для различных потоков к, одновременно получают доступ к тому же объекту, когда по крайней мере один поток вызывает не -
const
методы или методы, лишающие законной силы выдающиеся ссылки или итераторы к объекту. Программист ответственен за использование примитивов синхронизации потока для предотвращения таких ситуаций.
Развертывание с новым динамическим временем выполнения
Это - библиотека, пользовавшаяся по умолчанию при использовании GCC 4.0, и является надлежащим при предназначении для OS X v10.3.9 и позже. Для списка протестов для того, чтобы пользоваться этой библиотекой, посмотрите Протесты для Использования Новых Времен выполнения C++.
Развертывание с новым статическим временем выполнения
В Xcode 2.3, новой версии статической библиотеки стандарта C++ libstdc++-static.a
был представлен. Можно соединиться против новой статической библиотеки стандарта C++ с помощью Xcode 2.3 или командной строки. Для соединения против библиотеки с помощью XCode просто установите «Тип Библиотеки Стандарта C++» в настройках сборки к «Статическому». Для соединения против этой библиотеки по командной строке использовать gcc
вместо g++
и добавьте следующие две команды до конца команды: -shared-libgcc
и -lstdc++-static
. Например:
gcc one.o two.o -o my_application -shared-libgcc -lstdc++-static |
Для списка протестов для того, чтобы пользоваться этой библиотекой, посмотрите Протесты для Использования Новых Времен выполнения C++ и следующего раздела.
Дополнительные протесты для Использования нового статического времени выполнения
Новая статическая библиотека стандарта C++ отмечает все свои символы, как «скрытый», что означает, что те символы не экспортируются приложением, соединяющимся с библиотекой. Все еще возможно, однако, для символов от библиотеки C++ быть экспортированным Вашим приложением. Например, Ваше приложение могло бы включать символы от библиотеки в заголовочных файлах или других видимых расположениях. Чтобы препятствовать тому, чтобы символы были случайно экспортированы, необходимо использовать список экспорта для любых двоичных файлов, соединяющихся против статической библиотеки C++. (Для получения дополнительной информации об использовании списков экспорта, посмотрите Сокращение Количества Экспортируемых Символов. Для получения информации об использовании прагм видимости и видимости переключается, чтобы управлять видимостью символа в Вашем собственном коде, видеть Видимость Символа Управления.)
Функции обратного вызова (такой, как зарегистрировано в std::set_terminate
) являются только эффективными, когда инициировано в том же модуле кода.
Эта статическая библиотека имеет те же недостатки размера как тот, используемый с gcc 3.3. Для получения дополнительной информации об этой проблеме, посмотрите Преимущества Совместно используемого Времени выполнения C++.