2009-09-09 23 views
60

Sto lavorando su una libreria C++. In definitiva, mi piacerebbe renderlo pubblicamente disponibile per più piattaforme (almeno Linux e Windows), insieme ad alcuni esempi e binding Python. Il lavoro sta procedendo bene, ma al momento il progetto è abbastanza disordinato, costruito esclusivamente in e per Visual C++ e non multipiattaforma.Struttura di directory per una libreria C++

Pertanto, sento che una pulizia è in ordine. La prima cosa che vorrei migliorare è la struttura delle directory del progetto. Mi piacerebbe creare una struttura adatta agli strumenti Automake per consentire una facile compilazione su più piattaforme, ma non le ho mai usate prima. Dato che continuerò a fare (la maggior parte) la codifica in Visual Studio, avrò bisogno di qualche parte per mantenere anche i miei progetti di Visual Studio e i miei file di soluzione.

Ho provato a google termini come "struttura di directory libreria C++", ma non sembra utile nulla di utile. Ho trovato alcune linee guida molto basilari, ma nessuna soluzione cristallina.

Guardando alcune librerie open source, mi si avvicinò con il seguente:

\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 
    ... 

Non ho/poca esperienza precedente con lo sviluppo multi-piattaforma/progetti open source e sono molto stupito che non riesco a trovare eventuali buone linee guida su come strutturare un tale progetto.

Come si dovrebbe generalmente strutturare un tale progetto di biblioteca? Cosa si consiglia di leggere? Ci sono dei buoni esempi?

+0

sembra un duplicato di http://stackoverflow.com/questions/1383174/source-file-organisation/1383188#1383188 –

risposta

80

Una cosa che è molto comune tra le librerie Unix è che essi sono organizzati in modo tale che:

./   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` 

Essa riflette un po 'il filesystem tradizionale di Unix sotto /usr dove:

/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. 

Naturalmente, queste possono finire nel /usr/local (che è il prefisso di installazione predefinito per GNU autoconf), e potrebbero non aderire a questa struttura.

Non esiste una regola rigida. Personalmente non organizzo le cose in questo modo. (Meglio cercare di evitare una directory ./src/ a tutti tranne che per i più grandi progetti, per esempio. Io non uso anche autotools, preferendo invece CMake.)

Il mio suggerimento per voi è che si dovrebbe scegliere un layout di directory che marche senso per te (e la tua squadra). Fai ciò che è più sensato per l'ambiente di sviluppo scelto, gli strumenti di creazione e il controllo del codice sorgente.

+3

Quando si usa CMake, out- la build di origine sembra grande. – Korchkidu

5

Non penso che ci siano effettivamente delle buone linee guida per questo. La maggior parte è solo una preferenza personale. Alcuni IDE determineranno comunque una struttura di base per te. Visual Studio, ad esempio, creerà una cartella bin separata che è divisa in una sottocartella Debug e Release. In VS, questo ha senso quando si sta compilando il codice utilizzando obiettivi diversi. (Modalità debug, modalità di rilascio.)

Come dice greyfade, utilizzare un layout che abbia senso per voi. Se a qualcun altro non piace, dovranno solo ristrutturarlo da soli. Fortunatamente, molti utenti saranno felici della struttura che hai scelto. (A meno che non sia molto complicato.)

4

Trovo che la libreria wxWidgets (open source) sia un buon esempio. Supportano molte piattaforme diverse (Win32, Mac OS X, Linux, FreeBSD, Solaris, WinCE ...) e compilatori (MSVC, GCC, CodeWarrior, Watcom, ecc.). È possibile vedere il layout albero qui:

https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk/

Problemi correlati