Исключения между общедоступными библиотеками С++ в g++
Насколько я знаю, в С++ STD не определено (поведение undefined), как компилируемое приложение должно обрабатывать ситуации, когда одна разделяемая библиотека вызывает исключение внутри другого [shared lib]. Код, созданный g++/Linux, показывает, что можно создавать исключения между разделяемыми библиотеками.
Мои вопросы:
- Он переносимый (MSVS)?
- В каких случаях общая библиотека
A
не сможет обрабатывать исключение из общей библиотеки B
? [Я имею в виду, что приложение потерпит крах; библиотека A
знает о возможных исключениях из B
].
- Является ли поведение обработки исключений в моем примере зависимым от компоновщика?
Ответы
Ответ 1
Это действительно зависит от использования разделяемых библиотек. Если вы используете их как физические модули в одном приложении/системе и компилируете их с одним и тем же компилятором, вы должны быть в порядке (если вы также динамически ссылаетесь на стандартную библиотеку С++).
Однако, если есть вероятность, что общая библиотека скомпилирована с одним компилятором (включая другую версию того же самого компилятора) и доступ к модулю, скомпилированным другим, у вас есть проблемы: нет стандартного интерфейса совместимости с двоичными файлами для исключений.
Ответ 2
Это, похоже, проблема, зависящая от компилятора. У меня возникли проблемы с развертыванием в Windows, где MinGW-GCC должен быть построен с помощью общего libstdС++, чтобы включить обработку исключений между DLL (что не является дефолтом для версии Debian и требует от меня перекомпилировать GCC).
Таким образом, я предполагаю, что между компиляторами нет общего ABI, поскольку GCC даже не соответствует самому себе во всех отношениях. Что касается технических соображений, информация об обработке исключений с низким уровнем должна быть где-то сохранена, и это где-то, вероятно, будет третьей библиотекой C, которая обрабатывает исключения. Компиляторы могли бы поделиться этой библиотекой, но я предполагаю, что это не так.
С яркой стороны: в настоящее время я перекрестно компилирую довольно большой проект для POSIX-систем и Windows и в значительной степени использую исключения кросс-библиотеки в многопоточной среде. Он работает с общим libstdС++ для GCC, и поскольку все компоненты имеют открытый исходный код, мне было просто просто перекомпилировать все зависимости С++ для MinGW.