Tôi đã tham gia vào một số cuộc tranh luận liên quan đến các thư viện trong Linux và muốn xác nhận một số điều.
Theo hiểu biết của tôi (vui lòng sửa cho tôi nếu tôi sai và tôi sẽ chỉnh sửa bài đăng của mình sau), rằng có hai cách sử dụng thư viện khi xây dựng ứng dụng:
- Thư viện tĩnh (tệp .a): Tại thời điểm liên kết, một bản sao của toàn bộ thư viện được đưa vào ứng dụng cuối cùng để các chức năng trong thư viện luôn có sẵn cho ứng dụng gọi điện
- Các đối tượng được chia sẻ (tệp .so): Tại thời điểm liên kết, đối tượng chỉ được xác minh đối với API của nó thông qua tệp tiêu đề (.h) tương ứng. Thư viện không thực sự được sử dụng cho đến khi thời gian chạy, nơi cần thiết.
Ưu điểm rõ ràng của các thư viện tĩnh là chúng cho phép độc lập toàn bộ ứng dụng, trong khi lợi ích của các thư viện động là tệp ".so" có thể được thay thế (ví dụ: trong trường hợp cần cập nhật do bảo mật lỗi) mà không yêu cầu ứng dụng cơ sở được biên dịch lại.
Tôi đã nghe một số người phân biệt giữa các đối tượng được chia sẻ và các thư viện được liên kết động (DLL), mặc dù cả hai đều là các tệp ".so". Có sự khác biệt nào giữa các đối tượng được chia sẻ và DLL khi nói đến phát triển C / C ++ trên Linux hoặc bất kỳ HĐH tuân thủ POSIX nào khác (ví dụ: MINIX, UNIX, QNX, v.v.) không? Tôi được biết rằng một điểm khác biệt chính (cho đến nay) là các đối tượng dùng chung chỉ được sử dụng trong thời gian chạy, trong khi DLL phải được mở trước bằng cách sử dụng lệnh gọi dlopen () trong ứng dụng.
Cuối cùng, tôi cũng đã nghe một số nhà phát triển đề cập đến "lưu trữ được chia sẻ", theo hiểu biết của tôi, cũng là các thư viện tĩnh, nhưng không bao giờ được sử dụng trực tiếp bởi một ứng dụng. Thay vào đó, các thư viện tĩnh khác sẽ liên kết với "kho lưu trữ được chia sẻ" để kéo một số (nhưng không phải tất cả) các chức năng / tài nguyên từ kho lưu trữ được chia sẻ vào thư viện tĩnh đang được xây dựng.
Cảm ơn tất cả các bạn trước sự giúp đỡ của bạn.
Cập nhật
Trong bối cảnh các thuật ngữ này được cung cấp cho tôi, đó là những thuật ngữ sai lầm được sử dụng bởi một nhóm các nhà phát triển Windows phải học Linux. Tôi đã cố gắng sửa chúng, nhưng các chuẩn mực ngôn ngữ (không chính xác) bị mắc kẹt.
- Đối tượng chia sẻ: Một thư viện được tự động liên kết vào một chương trình khi chương trình khởi động và tồn tại dưới dạng một tệp độc lập. Thư viện được bao gồm trong danh sách liên kết tại thời gian biên dịch (nghĩa là:
LDOPTS+=-lmylib
đối với tệp thư viện có tênmylib.so
). Thư viện phải có mặt tại thời điểm biên dịch và khi ứng dụng khởi động. - Thư viện tĩnh: Một thư viện được hợp nhất vào chính chương trình thực tế khi xây dựng một ứng dụng (lớn hơn) chứa mã ứng dụng và mã thư viện được tự động liên kết thành một chương trình khi chương trình được xây dựng và nhị phân cuối cùng chứa cả hai chương trình chính và thư viện tồn tại dưới dạng một tệp nhị phân độc lập. Thư viện được bao gồm trong danh sách liên kết tại thời gian biên dịch (nghĩa là:
LDOPTS+=-lmylib
đối với tệp thư viện có tên mylib.a). Thư viện phải có mặt tại thời gian biên dịch. - DLL: Về cơ bản giống như một đối tượng chia sẻ, nhưng thay vì được đưa vào danh sách liên kết tại thời gian biên dịch, thư viện được tải thông qua
dlopen()
/dlsym()
lệnh để thư viện không cần phải có mặt trong thời gian xây dựng để chương trình biên dịch. Ngoài ra, thư viện không cần phải có mặt (nhất thiết) khi khởi động ứng dụng hoặc biên dịch thời gian , vì nó chỉ cần thiết tại thời điểmdlopen
/dlsym
cuộc gọi được thực hiện. - Lưu trữ được chia sẻ: Về cơ bản giống như một thư viện tĩnh, nhưng được biên dịch với các cờ "xuất khẩu chia sẻ" và "-fPIC". Thư viện được bao gồm trong danh sách liên kết tại thời gian biên dịch (nghĩa là:
LDOPTS+=-lmylibS
đối với tệp thư viện có tênmylibS.a
). Sự khác biệt giữa hai loại này là cờ bổ sung này là bắt buộc nếu một đối tượng chia sẻ hoặc DLL muốn liên kết tĩnh kho lưu trữ được chia sẻ thành mã riêng của nó VÀ có thể cung cấp các chức năng trong đối tượng chia sẻ cho các chương trình khác, thay vì chỉ sử dụng chúng nội bộ của DLL. Điều này rất hữu ích trong trường hợp khi ai đó cung cấp cho bạn một thư viện tĩnh và bạn muốn đóng gói lại dưới dạng SO. Thư viện phải có mặt tại thời gian biên dịch.
Cập nhật bổ sung
Sự khác biệt giữa " DLL
" và " shared library
" chỉ là một từ thông tục (lười biếng, không chính xác) trong công ty tôi làm việc tại thời điểm đó (các nhà phát triển Windows bị buộc phải chuyển sang phát triển Linux và thuật ngữ bị mắc kẹt), tuân thủ các mô tả đã nêu ở trên.
Ngoài ra, S
chữ "" theo sau tên thư viện, trong trường hợp "lưu trữ chia sẻ" chỉ là một quy ước được sử dụng tại công ty đó, và không phải trong ngành công nghiệp nói chung.
.a
các tệp, "a" thực sự là viết tắt của "archove" và nó chỉ đơn giản là một kho lưu trữ các tệp đối tượng. Các trình liên kết hiện đại phải đủ tốt để không cần bao gồm thư viện while, chỉ các tệp đối tượng trong kho lưu trữ cần thiết và thậm chí có thể chỉ sử dụng các phần của mã / dữ liệu trong các tệp đối tượng được tham chiếu.