Domanda

Ho un statica biblioteca * .lib creata usando MSVC sulle finestre. La dimensione della biblioteca è dire 70KB. Poi Ho un'applicazione che collega questa libreria. Ma ora la dimensione del file eseguibile finale (* .exe) è 29KB, inferiore alla biblioteca. Quello che voglio sapere è:

  1. Dal momento che la libreria è collegata in modo statico, stavo pensando che dovrebbe aggiungere direttamente al formato eseguibile e la dimensione finale exe dovrebbe essere di più? Ha formato EXE Windows anche fare un po 'la compressione dei dati binari?

  2. Come è per i sistemi Linux, che è come si fa dimensioni di biblioteca su Linux (* .a / *. La file) si riferiscono con dimensioni di file eseguibile Linux (* .out)?

-AD

È stato utile?

Soluzione

Non ci sono informazioni aggiuntive contabilità nel file .lib che non è necessario per l'eseguibile finale. Queste informazioni aiutano il linker trovare il codice per linkare realtà. Inoltre, le informazioni di debug possono essere memorizzate nel file .exe ma non nel <=> di file (non ricordo dove informazioni di debug viene conservato per objs in un file lib, potrebbe essere da qualche altra parte).

Altri suggerimenti

Una libreria statica sia su Windows e Unix è una raccolta di obj / file .o. Il linker guarda a ciascuno di questi file oggetto e determina se è necessario per il programma da collegare. Se non è necessario, quindi il file oggetto non sarà possibile ottenere incluso nel file eseguibile finale. Questo può portare a eseguibili che sono più piccoli poi la libreria.

EDIT: Come MSalters sottolinea, in Windows VC ++ compilatore ora supporta la generazione di file oggetto che consentono a livello di funzione di collegamento, ad esempio, si veda qui . In realtà, modificare-and-continue richiede questo, dal momento che la modifica-e-continua deve essere in grado di sostituire la parte più piccola possibile del file eseguibile.

La libreria statica probabilmente contiene diverse funzioni che non vengono mai utilizzati. Quando il linker collega biblioteca l'eseguibile principale, si vede che alcune funzioni non vengono mai utilizzate (e che i loro indirizzi sono mai presi e conservati in puntatori a funzione), getta solo via il codice. Si può anche fare questo in modo ricorsivo: se la funzione A () non viene mai chiamato, e A () chiama B (), ma B () non viene mai chiamato altrimenti, si può rimuovere il codice sia per A () e B (). Su Linux, la stessa cosa accade.

responsabilità :. E 'passato molto tempo da quando ho affrontato il collegamento statico, in modo da prendere la mia risposta con un grano di sale

Hai scritto: Stavo pensando che dovrebbe aggiungere direttamente al formato eseguibile e dimensione finale exe dovrebbe essere più di questo

?

linkers Naive funzionano esattamente in questo modo - indietro quando stavo facendo lo sviluppo hobby per i sistemi di CP / M (una volta tanto tempo fa), questo è stato un vero problema.

linker moderni sono più intelligenti, tuttavia - si collegano solo le funzioni a cui fa riferimento il codice originale, o come richiesto

.

In aggiunta alle risposte attuali, il linker è consentito per rimuovere definizioni di funzioni se hanno il codice oggetto identico -. Questo è destinato a contribuire a ridurre gli effetti gonfiore di codice basato su modelli

Una libreria statica deve contenere ogni simbolo definita nel suo codice sorgente, perché potrebbe ottenere legato in un file eseguibile che ha bisogno di simbolo proprio questo specifico. Ma una volta che esso è collegato in un file eseguibile, sappiamo esattamente quali simboli finiscono per essere usato, e quelli che non lo fanno. Così il linker può banalmente rimuovere il codice non utilizzato, tagliare la dimensione del file da un sacco. Allo stesso modo, tutti i simboli duplicati (tutto ciò che è definito sia nella libreria statica e l'eseguibile è collegata in ottiene fuse in una singola istanza.

@All: Grazie per i puntatori. @ Greg Hewgill - La tua risposta è stata una buona puntatore. Grazie.

La risposta ho scoperto è stato il seguente:

1.) Durante la costruzione Biblioteca ciò che accade è che se l'opzione "Mantieni Programma di debug databse" in MSVC (o qualcosa di simile) è ON, allora biblioteca avrà queste informazioni di debug gonfiore sua dimensione.  ma quando includo staticamente quella biblioteca e creare un file eseguibile, il linker spoglia tutto ciò che informazioni di debug dalla libreria prima di geenrating l'exe e quindi la dimensione EXE è inferiore a quella della biblioteca.

2). Quando ho disabilitato l'opzione "Mantieni Programma di debug databse", ho ottenuto una libreria la cui dimensione era minore del eseguibile finale, che era quello che ho pensato è nromal nella maggior parte delle situazioni.

-AD

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