2010-08-31 12 views
11

Contribuisco a un decent-sized C++ project con un numero di dipendenze. Il problema è che il progetto contiene la fonte di tutte le sue dipendenze (ad esempio pcre, zlib, ecc.). Voglio ridurre il progetto a ciò che è rilevante per il programma stesso. Esiste un modo relativamente standard per compilare queste librerie e metterle da qualche parte, e anche i loro file di intestazione sono facilmente accessibili?Dove devo mettere le librerie di terze parti?

Per quello che vale, sto usando Windows 7 e sto sviluppando utilizzando VS2005. Sono anche un noob completo con lavoro su grandi progetti C++ su Windows; Non ho mai avuto davvero bisogno di uscire dalla libreria standard e win32.

+4

Questo commento non sarà così utile, quindi non lo darò come risposta. Linux/etc ha questo più capito. Esistono src, lib, bin, include e altri nomi di directory standard. Quando scrivi una libreria sotto Windows, puoi posizionare le intestazioni della tua libreria, la fonte, ecc. Ovunque tu voglia metterle, e aspettarti che il mondo si conformi a te. Alcune delle librerie che hai citato sono disponibili sotto Linux, quindi probabilmente usa lo schema di directory standard –

+0

Hmm ...È un buon punto. Immagino che le librerie compilate vadano in lib e/o bin (a seconda della DLL/LIB-ness), e il codice dell'applicazione vada in src? Mi piace. – Twisol

+3

@Merlyn: Trovo strano che Linux abbia spazi standard per mettere le librerie C e includere i file, ma non esiste un luogo standard in cui sono memorizzati i * binari *. Gah! +1 per commentare. –

risposta

7

Una struttura che usiamo sul mio posto di lavoro sta avendo una cartella "esterno" che contiene una e una cartella "Include" "Lib" per le intestazioni ei movimenti di liberazione esterni. Tuttavia, poiché utilizziamo anche VS, cerchiamo di utilizzare la funzione "Dipendenze" il più possibile, rimuovendo gli input manuali dal linker. Ciò significa che solo i progetti che non sono sotto la stessa soluzione vanno alla cartella "Esterna". Inoltre, dato che abbiamo alcune librerie di terze parti specifiche per alcuni progetti, creiamo cartelle all'interno della cartella del progetto per questi include e libs. Questo è come si arriva:

 
.\ 
|-Project1\ --> contains Project1.vcproj 
|-Project2\ --> contains Project2.vcproj 
| |-Third-Party\ 
| |-Include\ 
| |-Lib\ 
|-External\ 
| |-Include\ 
| |-Lib\ 
|-InternalLibrary\ --> contains InternalLibrary.vcproj 
|-Solution.sln --> includes the vcproj's and link them as necessary by its dependencies 

non posso dire se questa è la migliore struttura mai, ma tutto è sotto il controllo di origine, che possiamo fare notte fonda solo con la costruzione della soluzione, e lo sviluppo passa attraverso la costruzione di un'unica progetti.

1

C'è un errore nella tua affermazione: "Voglio ridurre il progetto solo a ciò che è rilevante per il programma stesso."

Credetemi, le dipendenze sono estremamente rilevanti per il programma. Se non si dispone di questi nel controllo del codice sorgente, non si verificheranno problemi durante l'introduzione di nuovi membri del team o quando si passa a una nuova workstation.

Anche se si compilano le librerie "non rilevanti", queste librerie compilate devono essere inserite nel repository di origine.

+0

OK ... avrei dovuto dire "codice specifico dell'applicazione". Ho capito il tuo punto, comunque. Ma qual è il modo migliore per strutturare questo? In questo momento è tutto in un unico progetto. Dovrei semplicemente scomporlo in progetti separati sotto l'unica soluzione, o c'è un modo migliore? Onestamente non ho idea di quali siano le migliori pratiche qui e non ho trovato nulla con Google. – Twisol

+1

Non sono completamente d'accordo con questo. Un'installazione Boost, una volta che sono stati compilati gli esterni, è di circa 5 GB (10 GB se è necessario supportare VS2010 e VS2008). È irragionevole avere sotto il controllo del codice sorgente. –

0

gruppi che ho visto effettuare le seguenti operazioni:

  • codice interno separato dal codice esterno (codice hanno fatto vs società esterne)
  • separata dal loro codice codice della libreria
  • Separare ogni programma e ogni libreria
  • Archivia una versione compilata delle loro dipendenze, quindi non fa parte del loro intero ciclo di compilazione (almeno non in alcuni rami. Altre filiali potrebbero eseguire una compilazione più completa)

I progetti esistevano per ogni exe o libreria, nella directory con l'exe/libreria.

Le soluzioni esistevano ovunque i gruppi ritenevano che sarebbe stato utile e i binari erano spesso collegati, piuttosto che i loro progetti inclusi nelle sub-soluzioni. Solo una build completa è stata garantita per non infrangere un nuovo arruolamento.

Caveat emptor ...

Problemi correlati