2012-11-21 23 views

Odpowiedz

16

To zależy od tego, co dokładnie rozumie się przez "wykrywanie zależności bibliotek".

Komenda ldd działa na bibliotekach współużytkowanych, nie tylko na plikach wykonywalnych. wyświetlone zostaną zależności od udostępnionej biblioteki ogłosił gdy biblioteka została zbudowana:

$ ldd /usr/lib/libgtk-3.so 
    linux-vdso.so.1 (0x00007ffff8fff000) 
    libgdk-3.so.0 => /usr/lib/libgdk-3.so.0 (0x00007f43fcf47000) 
    libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x00007f43fcd43000) 
    libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0x00007f43fcb36000) 
    libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f43fc7fc000) 
... 

Biblioteka może mieć niezdefiniowane symbole, które są uzyskiwane poprzez połączenie z kolejnymi bibliotekami nie zadeklarowanych jako zależności. Można użyć objdump -T lub nm -D pokazać dynamiczne symbole - niezdefiniowane symbole (te, które powinny pochodzić z innych bibliotek) pojawi się jako *UND*:

$ objdump -T /usr/lib/libgtk-3.so | head 

/usr/lib/libgtk-3.so:  file format elf64-x86-64 

DYNAMIC SYMBOL TABLE: 
0000000000066e38 l d .init 0000000000000000    .init 
0000000000000000  DF *UND* 0000000000000000    g_param_spec_object 
0000000000000000  DF *UND* 0000000000000000    g_utf8_validate 
0000000000000000  DF *UND* 0000000000000000    g_date_get_month 
0000000000000000  DF *UND* 0000000000000000    g_bookmark_file_get_visited 
0000000000000000  DF *UND* 0000000000000000    g_value_get_float 

Z tych nazw symboli powinno być możliwe, aby wydedukować niezgłoszonych zależności bibliotecznych.

Biblioteki korzystające z pkg-config lub podobnego mechanizmu konfiguracyjnego czasami nie zgłaszają swoich zależności w czasie kompilacji, ale deklarują zależności do pkg-config, polegając na użytkownikach bibliotek, aby użyć narzędzia do uzyskania zależności. pkg-config --libs wyświetli listę zależności w formacie zrozumiałym dla kompilatora:

$ pkg-config --libs gtk+-3.0 
-lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0 
+0

Brawo! dobrze wyjaśnione. Powodzenia wszystkim. – shellter

+0

Dzięki! Dobrze wyjaśnione, potrzebuję tylko kilku dodatkowych informacji na temat wykorzystania kratownicy i nm. –