2011-12-23 26 views
11

Tengo una biblioteca compartida escrita en C++. Exporta una interfaz visible hecha de extern "C" funciones que crean, destruyen y manipulan tipos opacos.Biblioteca compartida de C++ llamada desde C

Ahora, me gustaría tener un programa C puro que use esta biblioteca.

¿Puedo hacer esto (plataforma de forma independiente)? ¿Cuándo se inicializará el tiempo de ejecución de C++ y los objetos estáticos de C++ si main no está escrito en C++?

Respuesta

5

La fase de inicialización depende de la plataforma. En el caso de Linux, las bibliotecas cargadas dinámicamente pueden tener símbolos especialmente declarados que son llamados automáticamente por dlopen() cuando se carga la biblioteca.

Consulte la página de manualidades para dlopen(3), sección Los símbolos obsoletos init() y fini() para obtener más información.

Los inicializadores estáticos están marcados implícitamente como __attribute__((constructor)), por lo que, en general, no tiene que hacer nada especial para llamarlos cuando se carga la biblioteca compartida. Sospecho que esto es lo mismo o similar en otras plataformas.

+0

Addendum. (glibc :) init/fini es proporcionado por el entorno de tiempo de ejecución (crtS.o) y se utiliza para la inicialización de objetos de duración estática y funciones de llamada marcadas __attribute __ ((constructor)), por lo que anular init/fini por su cuenta puede ocasionar problemas , incluido el rescate debido a una definición de doble símbolo. –

+0

@ jørgensen: ¿Podría ser esa la razón por la que están en desuso? – onitake

4

¿Puedo hacer esto (plataforma de forma independiente)?

La carga de la biblioteca depende de la plataforma.

¿Cuándo se inicializarán el tiempo de ejecución de C++ y los objetos estáticos de C++ si main no está escrito en C++?

No importa. Se inicializarán antes de que se ingrese el principal.

+1

Bueno, una biblioteca todavía puede cargarse (manualmente) después de que 'main' haya ingresado. Y "' Se inicializarán antes de que se ingrese el principal' "es una idea falsa. Su implementación define si la inicialización de un objeto estático ocurre antes de que se ingrese 'main', o en cualquier momento antes de su primer uso. Pero para todos los propósitos prácticos, sí, se inicializan antes de 'main', o inmediatamente después de que se carga la biblioteca. – jweyrich

1

Por lo general, los sistemas de bibliotecas compartidas tienen un punto de entrada propio para realizar este trabajo, no main, pero los archivos DLL tienen un DLLMain donde la implementación puede incluir dicho código. Sin embargo, en el caso general, no es de su incumbencia y es el trabajo del compilador que utilizó para resolver este problema.

Cuestiones relacionadas