Come combinare diverse librerie C / C ++ in una?

Sono stanco di aggiungere dieci librerie di collegamenti nel mio progetto, o di averne bisogno otto per utilizzare le mie. Mi piacerebbe prendere le librerie esistenti come libpng.a, libz.a, libjpeg.a e combinarle in un’unica libreria .a. È ansible? Che ne dici di combinare librerie .lib?

Sui sistemi Unix, le utilità ld e ar possono farlo. Dai un’occhiata a http://en.wikipedia.org/wiki/Ar_(Unix) o cerca le pagine man su qualsiasi Linux box o tramite google, ad esempio ‘unix man ar’.

Tieni presente che potrebbe essere preferibile il collegamento a una libreria condivisa (dynamic). Ciò aggiungerebbe una dipendenza al tuo eseguibile ma ridurrebbe drasticamente le sue dimensioni, specialmente se stai scrivendo un’applicazione grafica.

È ansible estrarre i file object da ciascuna libreria con

ar x  

e quindi unirli tutti in una nuova libreria con

 ar cs   

Su Linux o MinGW o Cygwin, con GNU toolchain:

 ar -M < 

O se puoi mantenere l'esistenza di liba.a e libb.a :

 ar crsT libab.a liba.a libb.a 

Su Windows, con MSVC toolchain:

 lib.exe /OUT:libab.lib liba.lib libb.lib 

Forse sto fraintendendo, ma non devi solo spedire le librerie se il codice dell’utente finale le chiama direttamente? Se tutti gli accessi ai metodi Jpeg ecc sono dal tuo codice nella tua libreria statica, quindi collega le librerie alla tua libreria.

ie

 ---------------- | End-user exe | ---------------- | | makes calls to | v -------------------- | Your static lib.a | -------------------- | makes calls to and links v ------------------------------------ ..... | | | ------------- -------- ---------- | libjpeg.a | |libz.a| |libpng.a| ------------- -------- ---------- 

Vale a dire, è solo un problema se il codice finale deve effettuare chiamate dirette in libz.a, libpng.a, ecc.

Se il codice dell’app ha una legittima necessità di chiamare libz.a, per esempio, allora come sopra sarebbe il caso di usare un modulo dinamico.

PS: ricevo un badge per artisti? 🙂

Non sono sicuro di come combinarli fisicamente in un singolo file, tuttavia potresti utilizzare un’astrazione di un tipo e includere solo un singolo “AllMyLibs.a / h” che a sua volta include tutto ciò che desideri. Puoi anche inserire questo nella posizione in cui il tuo compilatore cerca le librerie, quindi potrebbe funzionare per qualsiasi progetto.

PS – Per curiosità, perché non ti piace includere le singole librerie?

Combinare più librerie di terze parti in una può creare più problemi per te, ad esempio, se due di queste librerie definiscono un simbolo comune che il tuo programma non usa. Ora devi estrarre tutto (o tutto tranne uno) delle istanze del simbolo comune prima di unire le librerie.

Puoi provare questa libreria:

 #include 

se hai quasi tutte le librerie in c ++!