2011-10-20 14 views
11

Powiedz, że mam libA. Zależy to od, na przykład, libSomething z prostego faktu, że nieliniowa metoda libA wywołuje metodę w libSomething.h. W jaki sposób powiązanie zależności występuje w tym przypadku? Czy libA musi statycznie łączyć się z libSomething podczas kompilacji, czy użytkownik libA (aplikacja używająca libA) musi łączyć się z libA i libSomething?W jaki sposób biblioteki statyczne łączą się z zależnościami?

Dzięki

Odpowiedz

14

statyczna łącząca jest tylko kopiowanie całych elementów (funkcje, stałe, etc) do wynikowego pliku wykonywalnego. Jeśli kod biblioteki statycznej zawiera odwołania do niektórych elementów biblioteki współużytkowanej, odwołania te staną się zależnościami w wynikowym pliku wykonywalnym. To samo dotyczy łączenia biblioteki zamiast pliku wykonywalnego.

This thread omawia, jak to się dzieje w Linuksie.

+0

Jeśli nie chcę, aby wynikowy plik wykonywalny był obciążony, co mogę zrobić? – jmasterx

+1

@Milo: możesz połączyć statyczne biblioteki zależności libSomthing z libA. –

+0

@Milo: np. Nie chcesz mieć współdzielonych zależności? Następnie musisz połączyć wszystko statycznie, używając tylko bibliotek statycznych. Spowoduje to powstanie dużego niezależnego pliku wykonywalnego bez zależności. Ostrzegamy jednak, że trudno jest zbudować pewne biblioteki jako statyczne. – vines

4

Podczas kompilacji kompilator tłumaczy kod na format tymczasowy, nazwijmy go plikiem obiektowym. W pliku obiektowym znajduje się lista symboli, których kompilator nie mógł rozwiązać, zwykle w innych miejscach. Faza łączenia jest odpowiedzialna za rozwiązywanie tych symboli.

Proces kompilacji przesyła pliki do łącznika do momentu rozstrzygnięcia wszystkich symboli. Nie ma fizycznych list zależności, tylko listy symboli do rozwiązania. Pozwala to na rozpoznawanie symboli przy użyciu różnych bibliotek. Na przykład można chcieć użyć biblioteki systemu Windows w przypadku problemów specyficznych dla systemu Windows; biblioteka linuxa dotycząca problemów specyficznych dla Linuksa. Nie oznacza to wprost, że program jest zależny od biblioteki systemu Windows; może być również zależne od systemu Linux.

Niektóre kompilatory mogą generować listy zależności, zwykle do użycia w procesie kompilacji. Jednak ostateczna odpowiedzialność spoczywa na programistach.

6

Biblioteka statyczna jest mniej więcej zwykłym archiwum niepołączonych plików obiektów binarnych (* .o lub * .obj), podczas kompilacji archiwum nie jest wykonywane sprawdzanie zależności. Kiedy jeden linkuje binarny plik wykonywalny (lub bibliotekę współdzieloną/bibliotekę DLL), linker sprawdza wszystkie niezbędne zależności i dopiero wtedy powiadomi cię o wszelkich problemach.

Powiązane problemy