2010-04-15 35 views
428

Sự khác nhau giữa các thư viện tĩnh và chia sẻ là gì?Sự khác nhau giữa các thư viện tĩnh và chia sẻ?

Tôi sử dụng Eclipse và có một số loại dự án bao gồm Thư viện tĩnh và Thư viện được chia sẻ? Có ai có lợi thế hơn người kia không?

+3

Wikipedia có [mô tả hay] (http://en.wikipedia.org/wiki/Library_%28computing%29) về sự khác biệt giữa các thư viện tĩnh, động và chia sẻ. –

Trả lời

595

chung thư viện là .so (hoặc trong Windows .dll hoặc trong các tệp OS X .dylib). Tất cả các mã liên quan đến thư viện nằm trong tập tin này, và nó được tham chiếu bởi các chương trình sử dụng nó trong thời gian chạy. Một chương trình sử dụng một thư viện được chia sẻ chỉ làm cho tham chiếu đến mã mà nó sử dụng trong thư viện được chia sẻ.

Thư viện tĩnh là các tệp .a (hoặc trong Windows .lib). Tất cả các mã liên quan đến thư viện nằm trong tập tin này, và nó được liên kết trực tiếp với chương trình tại thời gian biên dịch. Một chương trình sử dụng một thư viện tĩnh có các bản sao của mã mà nó sử dụng từ thư viện tĩnh và làm cho nó trở thành một phần của chương trình. [Windows cũng có.các tệp lib được sử dụng để tham chiếu các tệp .dll, nhưng chúng hoạt động giống như tệp đầu tiên].

Có những ưu điểm và nhược điểm trong mỗi phương pháp.

Thư viện được chia sẻ giảm số lượng mã được sao chép trong mỗi chương trình sử dụng thư viện, giữ cho các tệp nhị phân nhỏ. Nó cũng cho phép bạn thay thế đối tượng được chia sẻ với một đối tượng có chức năng tương đương, nhưng có thể đã thêm các lợi ích hiệu suất mà không cần phải biên dịch lại chương trình sử dụng nó. Tuy nhiên, các thư viện chia sẻ sẽ có chi phí bổ sung nhỏ để thực hiện các chức năng cũng như chi phí tải thời gian chạy vì tất cả các ký hiệu trong thư viện cần được kết nối với những thứ chúng sử dụng. Ngoài ra, các thư viện chia sẻ có thể được nạp vào một ứng dụng tại thời gian chạy, đó là cơ chế chung để triển khai các hệ thống trình cắm thêm nhị phân.

Thư viện tĩnh tăng kích thước tổng thể của tệp nhị phân, nhưng điều đó có nghĩa là bạn không cần phải mang theo bản sao của thư viện đang được sử dụng. Khi mã được kết nối tại thời gian biên dịch, không có bất kỳ chi phí tải thời gian chạy bổ sung nào. Mã chỉ đơn giản là ở đó.

Cá nhân tôi thích thư viện chia sẻ hơn, nhưng sử dụng thư viện tĩnh khi cần đảm bảo nhị phân không có nhiều phụ thuộc bên ngoài có thể gặp khó khăn, chẳng hạn như phiên bản cụ thể của thư viện chuẩn C++ hoặc phiên bản Boost cụ thể Thư viện C++.

+2

"thay thế đối tượng được chia sẻ với ... chức năng tương đương, nhưng có thể [cải thiện] hiệu suất": cụ thể , chức năng tương đương với người gọi trong việc sử dụng ngữ nghĩa của API (giao diện lập trình ứng dụng: chữ ký chức năng và biến bao gồm các loại), nhưng chức năng bên thực hiện có thể khác biệt hơn perf .: vd chức năng luôn ghi vào tập tin -> cũng đăng nhập vào TCP máy chủ: cổng được mong đợi bằng $ MY_APP_LOG_SERVER. –

+1

"[.sos phải chịu một] chi phí bổ sung nhỏ để thực hiện các chức năng "- đó là * có thể * (nếu các nhóm chức năng/thứ tự đã được tối ưu hóa cho vùng nhớ đệm trong liên kết tĩnh, hoặc do những điều kỳ lạ trong hệ điều hành/trình tải/biên dịch/kiến ​​trúc như phân đoạn chéo/con trỏ lớn. hình phạt), nhưng trên nhiều kiến ​​trúc/biên dịch-cài đặt liên kết động các bản vá lỗi cuộc gọi để tạo ra chính xác cùng một máy gọi opcodes. –

+2

"Khi mã được kết nối tại thời gian biên dịch không có bất kỳ chi phí tải thời gian chạy bổ sung nào. Mã chỉ đơn giản là ở đó." - Có và không ... tất cả trong hình ảnh thực thi sẵn sàng được phân trang nếu thực thi yêu cầu, nhưng - bắt đầu từ một tình huống mà chương trình của bạn chưa chạy đủ gần đây để có trong bộ nhớ cache - với các thư viện được chia sẻ. hoặc nhất định) rằng hệ điều hành, trình điều khiển hoặc chương trình đang chạy khác sẽ tải cùng một thư viện được chia sẻ mà ứng dụng của bạn muốn sử dụng, trong trường hợp đó có thể trong bộ nhớ cache và chương trình của bạn bắt đầu và chạy nhanh hơn. –

24

Đối với thư viện tĩnh, mã được trích xuất từ ​​thư viện bởi trình liên kết và được sử dụng để tạo tệp thực thi cuối cùng tại thời điểm bạn biên dịch/xây dựng ứng dụng của bạn. Tệp thực thi cuối cùng không phụ thuộc vào thư viện vào thời gian chạy

Đối với thư viện được chia sẻ, trình biên dịch/liên kết kiểm tra tên bạn liên kết tồn tại trong thư viện khi ứng dụng được xây dựng, nhưng không di chuyển mã của chúng ứng dụng. Vào thời gian chạy, thư viện được chia sẻ phải có sẵn.

Bản thân ngôn ngữ lập trình C không có khái niệm về thư viện tĩnh hoặc chia sẻ - chúng hoàn toàn là một tính năng triển khai.

Cá nhân, tôi thích sử dụng thư viện tĩnh hơn, vì nó làm cho việc phân phối phần mềm đơn giản hơn. Tuy nhiên, đây là một ý kiến ​​về đó nhiều máu (tượng trưng) đã được đổ ra trong quá khứ.

+3

+1 cho "Bản thân ngôn ngữ lập trình C không có khái niệm về thư viện tĩnh hoặc chia sẻ - chúng hoàn toàn là một tính năng triển khai." – Tiger

14

Lợi thế quan trọng nhất của thư viện được chia sẻ là chỉ có một bản sao mã được tải trong bộ nhớ, cho dù có bao nhiêu tiến trình đang sử dụng thư viện. Đối với các thư viện tĩnh, mỗi quá trình đều có bản sao mã riêng của nó. Điều này có thể dẫn đến lãng phí bộ nhớ đáng kể.

OTOH, một lợi thế của các thư viện tĩnh là mọi thứ được đưa vào ứng dụng của bạn. Vì vậy, bạn không phải lo lắng rằng khách hàng sẽ có đúng thư viện (và phiên bản) có sẵn trên hệ thống của họ.

+1

hình ảnh thực thi lớn hơn trên đĩa, cũng như trong bộ nhớ, khi sử dụng libs tĩnh. – JustJeff

+0

Thats chính xác, đó là những gì tôi đã ám chỉ khi tôi nói mọi thứ được đưa vào ứng dụng của bạn. – Jasmeet

46

Giản:

  • liên kết tĩnh: một lượng lớn thực thi
  • động liên kết: một thực thi nhỏ cộng với một hoặc tập tin thư viện hơn (file .dll trên Windows, .so trên Linux, hoặc .dylib trên MacOS)
26

Thư viện tĩnh được biên dịch như một phần của ứng dụng, trong khi thư viện được chia sẻ thì không. Khi bạn phân phối một ứng dụng phụ thuộc vào các libaries dùng chung, các thư viện, ví dụ. dll trên MS Windows cần phải được cài đặt.

Ưu điểm của thư viện tĩnh là không có phụ thuộc bắt buộc đối với người dùng đang chạy ứng dụng - ví dụ: họ không phải nâng cấp DLL của họ về bất cứ điều gì ... Những nhược điểm là ứng dụng của bạn có kích thước lớn hơn bởi vì bạn đang vận chuyển nó với tất cả các thư viện mà nó cần.

Cũng như hàng đầu cho các ứng dụng nhỏ, các thư viện chia sẻ cung cấp cho người dùng khả năng sử dụng riêng, phiên bản có lẽ tốt hơn của họ về các thư viện chứ không phải dựa vào một đó là một phần của ứng dụng

+2

DLL địa ngục như nó đã được biết đến – gheese

+1

"Thư viện tĩnh được biên dịch như một phần của ứng dụng" ... thư viện tĩnh được biên dịch thành thư viện tĩnh và được liên kết như một phần của ứng dụng – user463035818

323

Thư viện tĩnh giống như hiệu sách và thư viện được chia sẻ giống như ... thư viện. Với trước đây, bạn có được bản sao của cuốn sách/chức năng của bạn để mang về nhà; với sau này bạn và mọi người khác đi đến thư viện để sử dụng cùng một cuốn sách/chức năng. Vì vậy, bất cứ ai muốn sử dụng (chia sẻ) thư viện cần phải biết nó ở đâu, bởi vì bạn phải "đi lấy" cuốn sách/chức năng. Với một thư viện tĩnh, cuốn sách/chức năng là của riêng bạn, và bạn giữ nó trong nhà/chương trình của bạn, và một khi bạn có nó, bạn không quan tâm ở đâu hoặc khi bạn đã nhận nó.

2

Trên đầu trang của tất cả các câu trả lời khác, có một điều không mentionned chưa được tách:

Hãy để tôi nói về một mã sản xuất thế giới thực, mà tôi đã được giao dịch với:

Một phần mềm rất lớn, làm từ> 300 dự án (với studio trực quan), chủ yếu là xây dựng dưới dạng lib tĩnh và cuối cùng tất cả liên kết với nhau trong một tệp thực thi lớn, bạn kết thúc với các vấn đề sau:

-Liên kết thời gian rất dài. Bạn có thể kết thúc bằng hơn 15 phút liên kết, giả sử 10 giây của thời gian biên dịch -Một số công cụ có trên đầu gối của chúng với một tệp thực thi lớn như bộ nhớ kiểm tra các công cụ phải có mã. Bạn có thể rơi vào giới hạn mà đã được coi là kẻ ngu.

Có nhiều vấn đề hơn là tách phần mềm của bạn: trên ví dụ thực tế này, các tệp tiêu đề của mọi dự án đều có thể truy cập được từ bất kỳ dự án nào khác. Kết quả là rất dễ dàng cho một nhà phát triển để thêm phụ thuộc; nó đã được chỉ là về việc bao gồm các tiêu đề, bởi vì liên kết ở cuối sẽ allwaws tìm biểu tượng. Nó kết thúc bởi phụ thuộc vào chu kỳ kinh khủng và hoàn toàn lộn xộn.

Với thư viện được chia sẻ, đó là một chút công việc phụ vì nhà phát triển phải chỉnh sửa hệ thống xây dựng dự án để thêm thư viện phụ thuộc. Tôi quan sát thấy rằng mã thư viện được chia sẻ có xu hướng cung cấp một API mã sạch hơn.

Các vấn đề liên quan