Estoy trabajando en una biblioteca de C ++. En última instancia, me gustaría que esté disponible públicamente para múltiples plataformas (Linux y Windows al menos), junto con algunos ejemplos y enlaces de Python . El trabajo avanza muy bien, pero en este momento el proyecto es bastante complicado, construido únicamente en y para Visual C ++ y no es multiplataforma en absoluto.
Por lo tanto, creo que es necesario realizar una limpieza. Lo primero que me gustaría mejorar es la estructura de directorios del proyecto. Me gustaría crear una estructura que sea adecuada para las herramientas de Automake para permitir una fácil compilación en múltiples plataformas, pero nunca antes las había usado. Como todavía estaré haciendo (la mayor parte) de la codificación en Visual Studio, necesitaré un lugar para guardar mi proyecto de Visual Studio y los archivos de solución también.
Intenté buscar en Google términos como "estructura de directorio de la biblioteca C ++", pero parece que no surge nada útil. Encontré algunas pautas muy básicas, pero no soluciones claras como el cristal.
Mientras miraba algunas bibliotecas de código abierto, se me ocurrió lo siguiente:
\mylib
\mylib <source files, read somewhere to avoid 'src' directory>
\include? or just mix .cpp and .h
\bin <compiled examples, where to put the sources?>
\python <Python bindings stuff>
\lib <compiled library>
\projects <VC++ project files, .sln goes in project root?>
\include?
README
AUTHORS
...
No tengo o tengo poca experiencia previa con proyectos de código abierto / desarrollo multiplataforma y estoy bastante sorprendido de que no puedo encontrar ninguna buena guía sobre cómo estructurar un proyecto de este tipo.
¿Cómo se debería estructurar en general un proyecto de biblioteca de este tipo? ¿Qué se puede recomendar leer? ¿Hay buenos ejemplos?
Respuestas:
Una cosa que es muy común entre las bibliotecas de Unix es que están organizadas de manera que:
./ Makefile and configure scripts. ./src General sources ./include Header files that expose the public interface and are to be installed ./lib Library build directory ./bin Tools build directory ./tools Tools sources ./test Test suites that should be run during a `make test`
De alguna manera refleja el sistema de archivos tradicional de Unix bajo
/usr
donde:/usr/src Sometimes contains sources for installed programs /usr/include Default include directory /usr/lib Standard library install path /usr/share/projectname Contains files specific to the project.
Por supuesto, estos pueden terminar en
/usr/local
(que es el prefijo de instalación predeterminado para GNU autoconf), y es posible que no se adhieran a esta estructura en absoluto.No hay una regla estricta. Yo personalmente no organizo las cosas de esta manera. (Evito usar un
./src/
directorio en absoluto, excepto para los proyectos más grandes, por ejemplo. Tampoco uso autotools, prefiero CMake).Mi sugerencia es que elija un diseño de directorio que tenga sentido para usted (y su equipo). Haga lo que sea más sensato para su entorno de desarrollo elegido, compile herramientas y control de código fuente.
fuente
Existe una convención increíble que encontré recientemente que podría ser útil: El diseño de Pitchfork (también en GitHub ).
En resumen, la subsección 1.3 establece que:
Además, creo que el
extras/
directorio es donde deberían ir sus enlaces de Python .fuente
No creo que haya buenas pautas para esto. La mayor parte es solo preferencia personal. Sin embargo, ciertos IDE determinarán una estructura básica para usted. Visual Studio, por ejemplo, creará una carpeta bin separada que se divide en las subcarpetas Debug y Release. En VS, esto tiene sentido cuando está compilando su código usando diferentes destinos. (Modo de depuración, modo de liberación).
Como dice greyfade, use un diseño que tenga sentido para usted. Si a alguien más no le gusta, tendrá que reestructurarlo ellos mismos. Afortunadamente, la mayoría de los usuarios estarán satisfechos con la estructura que ha elegido. (A menos que sea realmente complicado).
fuente
Creo que la biblioteca wxWidgets (código abierto) es un buen ejemplo. Soportan muchas plataformas diferentes (Win32, Mac OS X, Linux, FreeBSD, Solaris, WinCE ...) y compiladores (MSVC, GCC, CodeWarrior, Watcom, etc.). Puedes ver el diseño del árbol aquí:
https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk/
fuente
Realmente puedo recomendarle que use CMake ... es para desarrollo multiplataforma y es mucho más flexible que automake, use CMake y podrá escribir código multiplataforma con su propia estructura de directorios en todos los sistemas.
fuente