Ответ 1
Запрет "скрытых" использования стандартных типов библиотек совершенно безопасно смешивать libС++ и libstdС++ в одной программе, где некоторые TU (или библиотеки или модули) используют libС++, а некоторые используют libstdС++. Пока интерфейсы между TU не используют несовместимые типы, проблем не должно быть.
libС++ использует inline namespaces, чтобы гарантировать, что ABI несовместимые типы не могут быть ошибочно приняты друг за друга; если интерфейс использует libС++ std::string
, то библиотека, ожидающая libstdС++ std::string
, не будет ссылаться на интерфейс, потому что фактические символы различны: std::string
vs. std::__1::string
.
libС++ также гарантирует, что низкоуровневые функции, такие как исключения и динамическое распределение памяти, совместимы с ABI (предполагается, что вы создаете libstdС++ и libС++, используя одну и ту же библиотеку abi), поэтому безопасно освобождать память в TU, который использует, скажем, libС++, когда память была выделена в TU с использованием libstdС++ или выбрала исключение из сборки кода на libС++ и поймала его в коде с помощью libstdС++.
Может возникнуть проблема, когда типы в интерфейсах скрывают стандартные типы библиотек; с использованием интерфейса struct S { std::string s; };
определение типа S
будет различным, в зависимости от того, что TU считает std::string
, тем самым нарушив одно правило определения.
Однако это звучит так, как будто ваша настоящая проблема связана с библиотеками, которые используют стандартные типы библиотек в интерфейсах.
Я предполагаю, что можно предположить, что если я действительно хочу использовать libС++, я должен очистить мою систему чего-либо, используя stdlibС++, и убедиться, что что-либо из macports (или где-либо еще) связано только с libС++. Вы могли видеть, насколько сложна эта задача.
Вам нужно только убедиться, что TU, которые используют стандартную библиотеку в интерфейсах, используют libС++. Вам не нужно полностью очищать libstdС++. Библиотеки, которые не используют стандартную библиотеку в своем интерфейсе, могут продолжать связываться с libstdС++.
EDIT: я делаю подразумеваемый последующий вопрос более явным: Apple отправляет как libС++, так и libstdС++ с их системами. Предполагая, что один атакует основную проблему и пытается перейти на libС++ - только. Каким будет рекомендуемый способ перехода с libstdС++ на libС++, учитывая, что 100% библиотек, установленных в вашей системе (некоторые из них поставляются вместе с системой, большинство из них с помощью macports, несколько с помощью ручной компиляции) связаны с libstdС++ (если есть )? Кто-нибудь сделал это и выжил?
Помните, что это имеет значение только при использовании стандартной библиотеки в интерфейсах. Надеемся, что такие библиотеки уже переходят на libС++ самостоятельно, когда они строят для OS X. Если нет, возможно, они будут принимать исправления для этого.
Создание собственных двоичных файлов с использованием соответствующей библиотеки не является "взломом"; это правильная вещь, если вы не хотите, чтобы восходящий проект делал это для вас. Если вы последовательно используете libС++ в своем собственном коде, вам не нужно будет создавать несколько версий любой библиотеки; только версии libС++.
ссылка для совместимости libi ++: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-September/024594.html