Najlepsza odpowiedź
Zanim przejdziemy do tej różnicy, zobaczmy w skrócie proces tworzenia linków.
Dlaczego konsolidator?
Kiedy piszesz kod w C (lub w jakimkolwiek innym języku), jest on przechowywany w formacie .c.
#include
int main(){
printf("quora");
return 0;
}
Teraz ten program przechodzi przez fazę kompilacji, w której to kod źródłowy jest konwertowany na instrukcje języka maszynowego. Są to pliki obiektowe zapisane w formacie .o lub .obj. Jeśli mamy 2 oddzielne pliki, będziemy mieć 2 oddzielne pliki obj. Te pliki są po prostu tłumaczeniem twojego programu, aby uruchomić te programy, musimy wygenerować plik wykonywalny, który system operacyjny może faktycznie uruchomić. W tym celu używamy konsolidatora.
Teraz linker tworzy pojedynczy plik wykonywalny z wielu plików obiektowych. Teraz w naszym programie w C użyliśmy funkcji main (), ale gdzie jest jej definicja. Zakres kompilatora jest ograniczony tylko do jednego pliku, więc nie szuka odniesień, które mogły zostać zadeklarowane i zdefiniowane w innych plikach.
Linker przeszukuje wiele plików w celu znalezienia tej definicji funkcji „main ()” i łączy je. Przechodzę teraz do Twojego pytania.
Łączenie statyczne a dynamiczne:
- W linkowanie statyczne , wszystkie moduły biblioteki są kopiowane do końcowego obrazu wykonywalnego. Po załadowaniu programu system operacyjny umieszcza w pamięci tylko jeden plik, który zawiera zarówno kod źródłowy, jak i biblioteki odwołujące się. Podczas gdy w łączeniu dynamicznym w pamięci są umieszczane tylko nazwy bibliotek zewnętrznych lub współdzielonych. Łączenie dynamiczne pozwala wielu programom używać pojedynczej kopii modułu wykonywalnego.
- Łączenie statyczne jest wykonywane przez konsolidatory w ostatnim kroku kompilacji, podczas gdy dynamiczne łączenie jest wykonywane w czasie wykonywania przez system operacyjny.
- Pliki połączone statycznie zużywa więcej dysku i pamięci, ponieważ wszystkie moduły są już połączone. Ale w dynamicznym łączeniu jest przechowywana tylko jedna kopia modułu referencyjnego, która jest używana przez wiele programów, oszczędzając w ten sposób pamięć i miejsce na dysku.
- W łączeniu statycznym , jeśli zewnętrzny program źródłowy zostanie zmieniony, należy go ponownie skompilować i ponownie połączyć. Jednak w przypadku dynamicznego łączenia wystarczy zaktualizować i ponownie skompilować tylko jeden moduł.
- Statycznie połączone programy są szybsze niż ich dynamiczne odpowiedniki.
- Ponieważ plik z łączem statycznym zawiera każdy pakiet i moduł, nie występują żadne problemy ze zgodnością. Podczas gdy w dynamicznym łączeniu , ponieważ pliki bibliotek są przechowywane oddzielnie, mogą wystąpić problemy ze zgodnością (powiedzmy, że jeden plik biblioteki jest kompilowany przez nową wersję kompilatora).
- Programy połączone statycznie zawsze ładują się przez stały czas, podczas gdy czas jest zmienny w programach połączonych dynamicznie.