Подтвердить что ты не робот

Исключения между общедоступными библиотеками С++ в g++

Насколько я знаю, в С++ STD не определено (поведение undefined), как компилируемое приложение должно обрабатывать ситуации, когда одна разделяемая библиотека вызывает исключение внутри другого [shared lib]. Код, созданный g++/Linux, показывает, что можно создавать исключения между разделяемыми библиотеками.

Мои вопросы:

  • Он переносимый (MSVS)?
  • В каких случаях общая библиотека A не сможет обрабатывать исключение из общей библиотеки B? [Я имею в виду, что приложение потерпит крах; библиотека A знает о возможных исключениях из B].
  • Является ли поведение обработки исключений в моем примере зависимым от компоновщика?
4b9b3361

Ответ 1

Это действительно зависит от использования разделяемых библиотек. Если вы используете их как физические модули в одном приложении/системе и компилируете их с одним и тем же компилятором, вы должны быть в порядке (если вы также динамически ссылаетесь на стандартную библиотеку С++).

Однако, если есть вероятность, что общая библиотека скомпилирована с одним компилятором (включая другую версию того же самого компилятора) и доступ к модулю, скомпилированным другим, у вас есть проблемы: нет стандартного интерфейса совместимости с двоичными файлами для исключений.

Ответ 2

Это, похоже, проблема, зависящая от компилятора. У меня возникли проблемы с развертыванием в Windows, где MinGW-GCC должен быть построен с помощью общего libstdС++, чтобы включить обработку исключений между DLL (что не является дефолтом для версии Debian и требует от меня перекомпилировать GCC).

Таким образом, я предполагаю, что между компиляторами нет общего ABI, поскольку GCC даже не соответствует самому себе во всех отношениях. Что касается технических соображений, информация об обработке исключений с низким уровнем должна быть где-то сохранена, и это где-то, вероятно, будет третьей библиотекой C, которая обрабатывает исключения. Компиляторы могли бы поделиться этой библиотекой, но я предполагаю, что это не так.

С яркой стороны: в настоящее время я перекрестно компилирую довольно большой проект для POSIX-систем и Windows и в значительной степени использую исключения кросс-библиотеки в многопоточной среде. Он работает с общим libstdС++ для GCC, и поскольку все компоненты имеют открытый исходный код, мне было просто просто перекомпилировать все зависимости С++ для MinGW.