2011-11-16 17 views
6

Mój kompilator C++ tworzy pliki "dylib", które zawierają biblioteki dynamiczne. Jaka jest różnica między plikami .dylib i .so?Co oznaczają pliki dylib?

Jaka jest różnica między plikami w formacie Mach-O i plikami w formacie ELF? Muszę skompilować pliki do późniejszego wykorzystania w iOS (tylko biblioteki statyczne/Mach-O) i Android (ELF).

Thanx!

Odpowiedz

4

znalazłem, że:

Jedną z cech Mach-O, która uderza wielu ludzi z zaskoczenia jest ścisła rozróżnienie współdzielonych bibliotek i modułów ładowanych dynamicznie. Na systemach ELF oba są takie same; dowolny fragment udostępnionego kodu może być użyty jako biblioteka i do dynamicznego ładowania jako . Użyj otool -hv some_file, aby zobaczyć typ pliku some_file.

Współdzielone biblioteki Mach-O mają typ pliku MH_DYLIB i mają rozszerzenie .dylib. Można je łączyć ze zwykłymi statycznymi flagami łącznika , np. -lfoo dla libfoo.dylib. Jednak nie można ich załadować jako modułu. (Uwaga: Biblioteki współużytkowane mogą być ładowane dynamicznie za pośrednictwem interfejsu API , jednak interfejs API różni się od interfejsu API dla pakietów, a semantyka czyni go bezużytecznym dla emulacji dlopen() . Przede wszystkim nie można rozładować bibliotek współdzielonych .) [To nie jest już prawdą - możesz użyć dlopen() zarówno z dylibs, jak i bundles. Jednak dylibs nadal nie może zostać rozładowany.]

Moduły ładowalne nazywane są "wiązkami" w mowie Mach-O. Mają typ pliku MH_BUNDLE . Ponieważ żaden komponent się tym nie przejmuje, mogą mieć dowolne rozszerzenie. Rozszerzenie .bundle jest zalecane przez Apple, ale większość portowanych programów używa .so ze względu na zgodność z . Pakiety można dynamicznie ładować i rozładowywać za pomocą interfejsów API dyld . Istnieje również opakowanie, które emuluje dlopen() na tym interfejsie API . [dlopen jest teraz preferowanym API.] Nie można połączyć z pakietami tak, jakby były one bibliotekami współdzielonymi. Jednak jest możliwe, że pakiet jest powiązany z rzeczywistymi bibliotekami współdzielonymi; te zostaną załadowane automatycznie po załadowaniu pakietu.

Aby skompilować normalną bibliotekę współdzieloną na OS X, należy użyć -dynamiclib i rozszerzenia .dylib. -fPIC jest ustawieniem domyślnym.