Pregunta

Estoy trabajando con OpenCV y me gustaría poner toda la biblioteca dentro de su propio espacio de nombres. He mirado todo un poco, pero no han encontrado una respuesta ...

¿Se puede hacer esto sin modificar el código fuente de la biblioteca? Si entonces, ¿cómo?

¿Fue útil?

Solución

Básicamente no. Se podría intentar hacerlo escribiendo envoltorios y macros, pero sería poco probable que funcione. Si realmente necesita hacer esto, un enfoque mejor es que desembolsar la biblioteca y hacer las adiciones necesarias de espacio de nombres. Por supuesto, usted realmente necesita hacer es tomar este enfoque, y sospecho que no.

Otros consejos

Se podría, en principio, escribir un programa que analizar tablas de símbolos de exportación de la biblioteca, y alterar los nombres de los símbolos allí. Todavía había necesidad de cambiar los encabezados por supuesto.

Dicho esto sería mucho más fácil escribir un script sencillo para añadir etiquetas de espacio de nombres y volver a compilar la biblioteca.

La respuesta general es que no se puede, pero hay algunos trucos que puede hacer.

Por ejemplo, objcopy de binutils tiene la capacidad de copiar un objeto, pero poner un prefijo en cada símbolo mediante el uso de los --prefijo símbolos bandera. anteponiendo las cosas es a menudo espacios de nombres del pobre hombre y es una forma "ok" de evitar conflictos.

El uso es bastante simple, algo como esto:

objcopy --prefix-symbols "__mylib_" object.o new_object.o

NOTA:. Sí, funciona con archivos .so demasiado

NOTA 2: esta se romperá por completo c ++ renombrado de nombres, por lo que sólo intentar esto en una biblioteca con un API de estilo C. Puesto que usted está hablando de la adición de un espacio de nombres donde no la hay, supongo que este es el caso.

Usted puede proporcionar un archivo de cabecera envoltorio que declara la misma interfaz dentro de un espacio de nombres. En el archivo de origen envoltura, incluir las cabeceras de la biblioteca y poner en esa biblioteca. Ninguna fuente fuera de su fuente necesita saber acerca de los símbolos de la biblioteca. Si usted quiere ser muy cuidadoso, se puede poner que todos dentro de una biblioteca cargada dinámicamente.

Era muy común de hacer esto con COM para ocultar las dependencias del enlazador de alguna biblioteca. No se puede ver por qué no puede hacerlo con C ++.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top