2011-11-16 67 views
6

Trình biên dịch C++ của tôi tạo các tệp "dylib" chứa thư viện động. Whats sự khác biệt giữa các tập tin .dylib và .so?Ý nghĩa của tệp dylib là gì?

Và sự khác biệt giữa các tệp ở định dạng Mach-O và tệp ở định dạng ELF là gì? Tôi phải xây dựng các tập tin để sử dụng sau này trong iOS (chỉ các thư viện tĩnh/Mach-O) và Android (ELF).

Thanx!

Trả lời

4

tôi thấy rằng:

Một Mach-O tính năng mà lượt truy cập nhiều người ngạc nhiên là nghiêm ngặt sự phân biệt giữa các thư viện chia sẻ và mô-đun có thể load được. Trên các hệ thống ELF đều giống nhau; bất kỳ đoạn mã chia sẻ nào cũng có thể được sử dụng làm thư viện và tải động. Sử dụng otool -hv some_file để xem loại tệp của some_file.

Thư viện được chia sẻ Mach-O có loại tệp MH_DYLIB và thực hiện mở rộng .dylib. Chúng có thể được liên kết với các cờ liên kết tĩnh thông thường, ví dụ: -lfoo cho libfoo.dylib. Tuy nhiên, chúng không thể là được tải dưới dạng mô-đun. (Lưu ý phụ: Các thư viện được chia sẻ có thể được tải một cách động thông qua API. Tuy nhiên, API đó khác với API cho các gói và ngữ nghĩa làm cho nó vô dụng đối với một mô phỏng dlopen() . .) [Điều này không còn đúng — bạn có thể sử dụng dlopen() với cả dylibs và bó. Tuy nhiên, dylibs vẫn không thể được dỡ bỏ.]

Mô-đun có thể nạp được gọi là "bó" trong Mach-O nói. Họ có loại tệp MH_BUNDLE. Vì không có thành phần nào quan tâm đến nó, họ có thể thực hiện bất kỳ phần mở rộng nào. Phần mở rộng .bundle được đề xuất bởi Apple, nhưng hầu hết các phần mềm được chuyển sử dụng .so vì lợi ích của sự tương thích . Các gói có thể được tải và nạp tự động thông qua các API dyld và có một trình bao bọc mô phỏng dlopen() phía trên API đó. [dlopen giờ là API ưa thích.] Không thể liên kết với các gói như thể chúng là các thư viện được chia sẻ. Tuy nhiên, nó là có thể là một gói được liên kết với các thư viện được chia sẻ thực; những này sẽ được tải tự động khi gói được tải.

Để biên soạn thư viện được chia sẻ bình thường trên OS X, bạn nên sử dụng -dynamiclib và đuôi .dylib. -fPIC là mặc định.