una sistema propia para librerias libreria hacer definir declarar crear como biblioteca c++ cross-platform

c++ - sistema - crear tu propia libreria en c



La mejor estructura de carpetas para la biblioteca multiplataforma C++ y enlaces (4)

Estoy a punto de comenzar a trabajar en una biblioteca multiplataforma que se escribirá en C ++. En el futuro, pretendo implementar enlaces para otros lenguajes como Python, Java, etc. La biblioteca debe estar disponible en las principales plataformas: win32, Linux y Mac OSX.

Aunque la aplicación es realmente una biblioteca, algunos programas básicos de la consola se incluirán junto con ella para demostración y prueba.

Me gustaría encontrar una estructura de carpetas óptima antes de comenzar a almacenar cosas en Subversion.

Estoy pensando en algo como:

/project //Top level folder /bin //Binaries ready for deployment /linux_amd64 //Linux AMD64 platform /debug //Debug build - duplicated in all platforms /release //Release build - duplicated in all platforms /linux_i386 //Linux 32-bit platform /macosx //Mac OS X /win32 //Windows 32-bit platform /cygwin //Windows 32-bit platform compiled with Cygwin /vs.net //Windows 32-bit platform compiled with Visual Studio .NET /win64 //Windows 64-bit platform /build //Make and build files, IDE project files /linux_amd64 //Linux AMD64 platform /linux_i386 //Linux 32-bit platform /macosx //Mac OS X /win32 //Windows 32-bit platform /win64 //Windows 64-bit platform /config //Configuration files that accompany the binaries /data //Data files that accompany the binaries /doc //Documentation /lib //External or third-party libraries /platforms //Platform-specific code for ... /linux_amd64 //Linux AMD64 platform /linux_i386 //Linux 32-bit platform /macosx //Mac OS X /win32 //Windows 32-bit platform /win64 //Windows 64-bit platform /src //Available library source code in subfolders /src //Source code tree - this will contain main.cpp /bindings //Bindings to other languages such as ... /python /java /h //Header files /modules //Platform-independent modules, components or subprojects /platforms //Platform-specific code for ... /linux_amd64 //Linux AMD64 platform-specific code /linux_i386 //Linux 32-bit platform-specific code /macosx /win32 //Windows 32-bit platform-specific code /win64 //Windows 64-bit platform /test //Automated test scripts

Si tienes sugerencias, me encantaría escucharlas. Me pregunto si hay una herramienta que pueda ayudar a crear esta estructura.

Estoy planeando usar CMake y Subversion.


¿Por qué necesita diferentes carpetas de plataforma para archivos binarios? ¿Vas a construir este código fuente bajo diferentes platoforms pero con el mismo sistema de archivos?

Si es así, creo que también necesita carpetas específicas de compiller.

¿Por qué no utiliza diferentes carpetas para depurar y lanzar compilación, tal vez compilaciones unicode y no unicode, de subprocesamiento único o multiproceso?

Mira en bjam o Scons hacer sustitutos. Tal vez no necesites carpetas diferentes en el directorio de compilación.

Creo que será mejor si todos los módulos del directorio "modules" contendrán el directorio "tests" para autodiagnóstico.

Y por último, consulte la biblioteca de impulso, esta biblioteca independiente de platofrm que tiene una estructura agradable.

También intente obtener ideas de otros proyectos independientes de plataformas.

Estructura Boost carpetas:

boost - root dir - boost - library header lib ( for users ) - libs - library source dir ( one dir per lib ) - build - library build files ( if they are needed ) - doc - documentation files - example - sample programs - src - library source files - test - programs and srcipts for testing module - bin - created by bjam build system - libs - <lib-name> for all compiled folders from libs [example|test|build] - <compiler-name>/<[static|dynamic]-link>/<[debug|release]>/<[threading mode]> contain builded [obj|dll|lib|pdb|so|o|etc] files see detailed information in bjam build system - doc - tools

Si eliges bjam, no te preocuparán las estructuras compiladas y las carpetas bin.

También su libs / src / dir puede contener own para todos los archivos de plataforma y directorios par para archivos específicos de plataforma.

No veo ningún problema serio en la estructura de sus carpetas, tal vez las verá cuando comience a escribir el prototipo del proyecto.


¿Puedo sugerir que no use la arquitectura para categorizar los archivos de compilación?

Estaba tratando de aplicar la estructura de carpetas propuesta, pero no pude encontrar el lugar correcto para poner las definiciones comunes de archivos Makefile de Linux y los archivos de propiedades de Visual Studio. ¿Qué tal solo lo siguiente?

/project /build /linux /macosx /win32 (or win)

Y el ejemplo de caso incluiría:

/project /build /linux Make.defs Makefile [i386, amd64] /win32 /VC8 /<project> <project>.vcproj <solution>.sln [Win32, x64] /VC11 /<project> <project>.vcxproj <solution>.sln [Win32, x64, ARM]

Si no quiere definir compilaciones de arquitectura a través de configuraciones, ¿qué hay de otra capa de carpeta bajo los tipos de plataforma?

/project /build /linux /linux_amd64 /linux_i386 /macosx /? /win32 (or win) /win32 /win64

Si un proyecto determinado no tendrá ningún archivo de compilación común para una plataforma, la estructura original sería suficiente.


Hace poco publiqué una pregunta sobre los encabezados de los paquetes en un solo directorio, decidí ir con un pequeño número de directorios de inclusión.

¿Va a atender a Win64? Ese será un objetivo cada vez más importante.

No coloque sus archivos intermedios de compilación en cualquier lugar debajo de un árbol que esté siendo registrado en svn. Si lo hace, dependiendo de sus herramientas de cliente svn, generarán mucho ruido como archivos que no están en el repositorio. Eso hace que sea difícil ver los archivos que ha agregado que deberían estar en el repositorio.

En cambio, si su compilador lo permite, coloque los directorios intermedios a un lado.

De lo contrario, asegúrese de agregar todos los directorios intermedios a sus propiedades de exclusión de svn. Algunas GUI lo hacen más fácil que otros (Tortoise en Windows, Cornerstone o versiones en OS / X).


La estructura se ve bien para mí, pero hay algunos puntos:

  • es normal separar el encabezado C ++ y los archivos fuente en directorios diferentes, o tal vez hay una estructura en el directorio de módulos que no se muestra?
  • es probable que desee directorios para poner archivos intermedios como * .obj en
  • Necesitará diferentes directorios para depurar y liberar archivos de salida
  • un directorio para instaladores como InnoSetup y sus archivos de instalación puede ser útil; debe tomar una decisión filosófica sobre si controlar la versión de estos

En cuanto a las herramientas para crear la estructura, basta con unos minutos para escribir un script bash; vale la pena tener las mismas herramientas (como bash) disponibles en todas las plataformas.