Domanda

Sono stanco di aggiungere dieci librerie di collegamenti al mio progetto o di richiederne otto per utilizzare la mia.Mi piacerebbe prendere le librerie esistenti come libpng.a, libz.a, libjpeg.a e combinarle in un'unica libreria .a.È possibile?Che ne dici di combinare le librerie .lib?

È stato utile?

Soluzione

Sui sistemi simili a Unix, le utility ld e ar possono farlo.Guardare http://en.wikipedia.org/wiki/Ar_(Unix) oppure cerca le pagine man su qualsiasi sistema Linux o tramite Google, ad esempio "unix man ar".

Tieni presente che potrebbe essere meglio collegarti a una libreria condivisa (dinamica).Ciò aggiungerebbe una dipendenza al tuo eseguibile ma ne ridurrà drasticamente le dimensioni, soprattutto se stai scrivendo un'applicazione grafica.

Altri suggerimenti

È possibile estrarre i file oggetto da ciascuna libreria con

ar x <library name>

e poi unirli tutti in una nuova libreria con

ar cs <new library name> <list each extracted object file>

Su Linux o MinGW o Cygwin, con la toolchain GNU:

ar -M <<EOM
    CREATE libab.a
    ADDLIB liba.a
    ADDLIB libb.a
    SAVE
    END
EOM
ranlib libab.a

O se riesci a mantenere l'esistenza di liba.a E libb.a:

ar crsT libab.a liba.a libb.a

Su Windows, con la toolchain MSVC:

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

Forse ho frainteso, ma non devi spedire le librerie solo se il codice dell'utente finale le chiama direttamente?Se tutto l'accesso ai metodi Jpeg ecc. proviene dal tuo codice nella libreria statica, collega semplicemente le librerie alla tua lib.

Cioè.

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

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

Se, ad esempio, il codice dell'app ha la necessità legittima di richiamare libz.a, allora, come menzionato sopra, sarebbe il caso di utilizzare un modulo dinamico.

PS:Otterrò un badge da artista?:)

Non sono sicuro di come combinarli fisicamente in un unico file, tuttavia potresti utilizzare una sorta di astrazione e includere semplicemente un singolo "AllMyLibs.a/h" che a sua volta include tutto ciò che desideri.Potresti anche inserirlo nella posizione in cui il tuo compilatore cerca le librerie, quindi funzionerebbe per qualsiasi progetto.

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

Combinare diverse librerie di terze parti in una sola potrebbe creare più problemi, ad esempio se due di queste librerie definiscono un simbolo comune che il tuo programma non utilizza.Ora devi estrarre tutte (o tutte tranne una) le istanze del simbolo comune prima di combinare le librerie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top