Aquí es lo que estoy acostumbrado a hacer:
"Algunos objetos tienen los mismos nombres, pero están en diferentes espacios de nombres"
Es por eso que existen espacios de nombres.
"¿Sería apropiado para crear un segundo archivo .h para exponer sólo el API pública?"
Siempre debe exponer sólo el API pública. Pero, ¿qué significa exponer la API pública? Si fuera solo a los encabezados, dado que la API pública depende de la API privada, la API pública sería incluida por la API pública de todos modos. Exponer una API pública marca funciones/clases públicas con una macro (que en el caso de Windows exporta funciones públicas a la tabla de símbolos, y probablemente pronto será adoptada por los sistemas Unix). Por lo tanto, debe definir una macro como MYLIB_API o MYLIB_DECLSPEC, simplemente verifique algunas bibliotecas existentes y la documentación de MS declspec. Es suficiente, generalmente API no pública se mantendrá en subdirectorios por lo que no atiende al usuario de la biblioteca.
"¿Debería ser un archivo .h por espacio de nombres o por objeto o algún otro ámbito?"
Prefiero el estilo Java, uno público clase por encabezado. Descubrí que las libs escritas de esta manera son mucho más limpias y legibles que las que mezclan nombres de archivos y estructuras. Pero hay casos en que freno esta regla, especialmente cuando se trata de plantillas. En tales casos, doy un mensaje de advertencia para que no incluya el encabezado directamente y explico cuidadosamente en los comentarios lo que está sucediendo.
Pero al juntar todo en una sola biblioteca .so, ¿distribuyo una estructura de directorios de inclusión profunda? Chenz –
Quiero decir .so o .dll –
@Crazy Chenz, sí, esta es una posibilidad. Así es como se hace en el kernel de Linux, por ejemplo, y también en algún grado de impulso. – shoosh