2014-04-20 13 views
9

Ho comunemente sentito il termine "link a una libreria". Sono nuovo per i compilatori e quindi il collegamento, quindi mi piacerebbe capirlo un po 'di più.Cosa significa collegare a qualcosa?

Che cosa significa per collegare contro una biblioteca e quando non sarebbe farlo causare un problema?

risposta

11

Una libreria è un "archivio" che contiene il codice già compilato. In genere, si desidera utilizzare una libreria pronta all'uso per utilizzare alcune funzionalità che non si desidera implementare autonomamente (ad esempio decodificare i file JPEG, analizzare il codice XML, fornire i widget della GUI, il nome).

genere in C e C++ utilizzando una libreria va così: si #include alcune intestazioni della libreria che contiene la funzione/classe dichiarazioni - cioè dicono al compilatore che i simboli che devi fare esistere da qualche parte, senza in realtà fornire il loro codice. Ogni volta che li usi, il compilatore inserisce nel file oggetto un segnaposto, che dice che quella chiamata di funzione deve essere risolta al momento del collegamento, quando il resto dei moduli oggetto sarà disponibile.

Poi, al momento del collegamento, è necessario specificare la libreria effettivo in cui il codice compilato per le funzioni della biblioteca si trova; il linker quindi collegherà questo codice compilato al tuo e produrrà l'eseguibile finale (o, nel caso di librerie dinamiche, aggiungerà le informazioni rilevanti per il loader per eseguire il collegamento dinamico in fase di runtime).

Se non si specifica che la libreria deve essere collegata, il linker avrà riferimenti non risolti - cioè vedrà che alcune funzioni sono state dichiarate, le hai usate nel codice, ma la loro implementazione non è da nessuna parte trovato; questa è la causa degli infami "errori di riferimento non definiti".

Si noti che tutto questo processo è identico a quello che succede normalmente quando si compila un progetto che è fatto di più file .cpp: ogni .cpp viene compilato in modo indipendente (conoscendo le funzioni definite negli altri solo attraverso prototipi, di solito scritto in .h file), e alla fine tutto è collegato insieme per produrre l'eseguibile finale.

+0

È vero anche per le intestazioni standard? Ad esempio, '' include solo dichiarazioni ma non l'implementazione? Dove risiede l'implementazione? – user2030677

+0

E 'soprattutto la stessa, la differenza principale è che in genere il compilatore C++ dice automaticamente al linker che collega alla libreria standard (di cui ci possono essere diverse versioni, ad esempio, in modo statico/dinamico collegato, debug/ottimizzato, ..., scelti a seconda dei flag del compilatore). Inoltre, tieni presente che molte intestazioni contengono codice per le funzioni 'inline' (per consentire al compilatore di eseguire effettivamente l'inlining) e modelli (e questo è il motivo per cui gran parte della parte STL della libreria standard è solo per l'intestazione). –