2011-07-28 27 views
13

Por lo que yo sé que no está definida (comportamiento no definido) en C++ ETS cómo la aplicación compilada debe manejar situaciones en las que una biblioteca compartida plantea una excepción dentro de otro [librería compartida]. El código producido por G ++/Linux muestra que es posible generar excepciones entre bibliotecas compartidas.excepciones entre bibliotecas compartidas en C++ g ++

Mis preguntas son:

  1. ¿Es portátil (MSVS)?
  2. ¿En qué casos biblioteca compartida A no será capaz de manejar una excepción de la biblioteca compartida B? [Quiero decir que la aplicación se bloqueará; la biblioteca A conoce las posibles excepciones de B].
  3. ¿El comportamiento de manejo de excepciones en mi ejemplo depende del enlazador?
+0

+1 Estuve deambulando por mucho tiempo. Escuché el "mito" de "sin excepciones entre los límites compartidos de la biblioteca" hace mucho tiempo, pero dado que prácticamente todas las bibliotecas de terceros que uso arrojan excepciones supongo que es un mito. Esperando algunas respuestas ... – davka

Respuesta

2

Esto parece ser un tema compilador-dependiente. He tenido problemas al implementarlo en Windows, donde el MinGW-GCC debe compilarse con libstdC++ compartido para permitir el manejo de excepciones entre DLL (que no es el predeterminado para la versión de Debian y requería que volviera a compilar el GCC)

lo tanto asumo que no hay ABI común entre los compiladores, ya que el CCG ni siquiera se conforma con la misma en todos los aspectos. Con respecto a las consideraciones técnicas, la información de manejo de excepciones de bajo nivel debe almacenarse en algún lugar, y es probable que esta sea una tercera biblioteca C, que maneja excepciones. Los compiladores pueden compartir esta biblioteca, pero supongo que no.

En el lado positivo: Actualmente estoy cruzada compilar un proyecto bastante grande para sistemas POSIX y Windows y en gran medida el uso de excepciones cruzada de la biblioteca en un entorno multi-hilo. Funciona con una libstdC++ compartida para GCC, y como todos los componentes son de código abierto, tuve el lujo de simplemente recompilar todas las dependencias de C++ para MinGW.

3

Eso realmente depende de su uso de bibliotecas compartidas. Si los usa como módulos físicos dentro de una misma aplicación/sistema y los compila con el mismo compilador, debería estar bien (siempre que también establezca un enlace dinámico con la biblioteca estándar de C++).

Sin embargo, si existe la posibilidad de que una biblioteca compartida se compile con un compilador (incluyendo otra versión del mismo compilador) y se accede por un módulo compilado por otro, tiene problemas: no hay compatibilidad binaria estándar interfaz para excepciones.

Cuestiones relacionadas