Исключения между общими библиотеками C ++ в g ++ - PullRequest
13 голосов
/ 28 июля 2011

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

Мои вопросы:

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

Ответы [ 2 ]

3 голосов
/ 28 июля 2011

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

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

2 голосов
/ 28 июля 2011

Кажется, это проблема, зависящая от компилятора.У меня были проблемы с этим при развертывании в Windows, где MinGW-GCC должен быть собран с общей библиотекой libstdc ++, чтобы разрешить обработку исключений между библиотеками DLL (что не является версией по умолчанию для версии Debian и требует от меня повторной компиляции GCC).

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

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

...