Развертывание приложений со временем выполнения 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++.