.dll
hoặc .so
được chia sẻ libs (được liên kết trong thời gian chạy), trong khi .a
và.lib
là một thư viện tĩnh (được liên kết trong thời gian biên dịch). Điều này không có sự khác biệt giữa Windows và Linux.
Sự khác biệt là, chúng được xử lý như thế nào. Lưu ý: sự khác biệt chỉ có ở hải quan, chúng được sử dụng như thế nào. Sẽ không quá khó để làm cho Linux xây dựng theo cách của Windows và ngược lại, ngoại trừ việc thực tế không ai làm điều này.
Nếu chúng ta sử dụng một dll, hoặc chúng ta gọi một hàm thậm chí từ nhị phân của chính chúng ta, có một cách đơn giản và rõ ràng. Ví dụ: trong C, chúng ta thấy rằng:
int example(int x) {
...do_something...
}
int ret = example(42);
Tuy nhiên, ở cấp độ asm, có thể có nhiều sự khác biệt. Ví dụ, trên x86, một call
opcode được thực thi và 42
được đưa ra trên ngăn xếp. Hoặc trong một số đăng ký. Hoặc bất cứ nơi nào. Không ai biết rằng trước khi viết dll , nó sẽ được sử dụng như thế nào. Hoặc làm thế nào các dự án sẽ muốn sử dụng nó, có thể được viết bằng trình biên dịch (hoặc bằng ngôn ngữ!) Mà thậm chí không tồn tại ngay bây giờ (hoặc chưa biết đối với các nhà phát triển của dll).
Ví dụ, theo mặc định, cả C và Pascal đều đặt các đối số (và nhận các giá trị trả về) từ ngăn xếp - nhưng chúng đang thực hiện theo thứ tự khác nhau . Bạn cũng có thể trao đổi các đối số giữa các chức năng của mình trong các thanh ghi bằng một số - tối ưu hóa phụ thuộc vào trình biên dịch.
Như bạn thấy chính xác, tùy chỉnh Windows là xây dựng một dll, chúng tôi cũng tạo ra một mức tối thiểu .a
/ .lib
với nó. Thư viện tĩnh tối thiểu này chỉ là một trình bao bọc, các ký hiệu (hàm) của dll được tiếp cận thông qua nó. Điều này làm cho các chuyển đổi cuộc gọi cấp asm cần thiết.
Ưu điểm của nó là khả năng tương thích. Nhược điểm của nó là nếu bạn chỉ có một dll, bạn có thể gặp khó khăn để tìm hiểu xem các chức năng của nó muốn được gọi như thế nào. Điều này làm cho việc sử dụng dlls trở thành một nhiệm vụ hack, nếu nhà phát triển của dll không cung cấp cho bạn.a
. Do đó, nó phục vụ chủ yếu cho các mục đích đóng cửa, ví dụ như vậy để có thêm tiền mặt cho SDK dễ dàng hơn.
Một nhược điểm khác của nó là ngay cả khi bạn sử dụng một thư viện động, bạn cần phải biên dịch trình bao bọc nhỏ này một cách tĩnh.
Trong Linux, giao diện nhị phân của các dll là tiêu chuẩn và tuân theo quy ước C. Do đó, không .a
bắt buộc và có sự tương thích nhị phân giữa các lib được chia sẻ, đổi lại chúng ta không có những lợi thế của tùy chỉnh microsoft.