2010-03-16 42 views
10

Tôi muốn phát hành một ứng dụng mà tôi đã phát triển như một sở thích cho cả Linux và Windows. Ứng dụng này phụ thuộc vào tăng (và có thể là các thư viện khác). Định mức cho loại ứng dụng này (một công cụ cờ vua) là chỉ cung cấp một tệp thi hành và có thể một số tệp trợ giúp.Ưu và nhược điểm của việc liên kết tĩnh một thư viện là gì?

Tôi khó có thể liên kết tĩnh các thư viện để tệp thực thi sẽ không có bất kỳ phụ thuộc nào. Vì vậy, người dùng cuối chỉ có thể đặt tệp thi hành vào một thư mục và bắt đầu sử dụng nó.

Tuy nhiên, khi thực hiện một số nghiên cứu trực tuyến, tôi đã tìm thấy một số nhận xét tiêu cực về thư viện liên kết tĩnh, một số thậm chí còn cho rằng ứng dụng có thư viện được liên kết tĩnh sẽ khó di chuyển, nghĩa là nó chỉ chạy trên hệ thống của tôi có hệ thống tương tự cao.

Vì vậy, ưu và nhược điểm của thư viện liên kết tĩnh là gì?

Tôi đã biết rằng tệp thực thi sẽ lớn hơn. Nhưng tôi không thể thấy lý do tại sao nó sẽ làm cho ứng dụng của tôi ít di động hơn.

+2

Rất nhiều lần lừa, bao gồm http://stackoverflow.com/questions/140061/when-to-use-dynamic-vs-static-libraries –

+0

@MathieuL Xem nhanh, cũng http://stackoverflow.com/ câu hỏi/938992/những gì-là-the-thuận-và-khuyết-of-sử dụng-a-dll trông giống như nó địa chỉ các câu hỏi. Có thể bạn có thể kiểm tra các liên kết SO này và/hoặc tìm kiếm thêm một chút trong SO và đăng lại với câu hỏi chính xác hơn nếu các bài đăng trước không trả lời nhu cầu cụ thể của bạn. – mjv

Trả lời

5

Ưu điểm:
Không phụ thuộc.

Nhược điểm:
Sử dụng bộ nhớ cao hơn, vì hệ điều hành không thể sử dụng bản sao được chia sẻ của thư viện nữa.
Nếu thư viện cần được cập nhật, ứng dụng của bạn cần được xây dựng lại. Điều này là quan trọng gấp đôi đối với các thư viện mà sau đó có các bản sửa lỗi bảo mật.

Tất nhiên, vấn đề lớn hơn đối với tính di động là thiếu phân phối mã nguồn.

+0

Vâng, có _are_ phụ thuộc, trừ khi bạn liên kết tĩnh mọi thứ (bao gồm cả libc), điều này đặc biệt đúng khi sử dụng phần mở rộng GNU. –

+0

Có lẽ "không phụ thuộc" nên được thay đổi thành "không phụ thuộc thời gian chạy thêm" –

0

Nếu bạn liên kết các thư viện tĩnh, trừ khi bạn thêm các thông tin để kiểm tra hệ thống của người dùng cho các thư viện bạn đã liên kết, bạn sẽ khóa ứng dụng của mình để sử dụng các phiên bản thư viện đó cho đến khi bạn cập nhật tệp thực thi. Lỗ hổng bảo mật xảy ra và cập nhật diễn ra. (Đối với một động cơ cờ vua có thể không có quá nhiều vấn đề, nhưng ai biết được.)

2

Giả sử thư viện tĩnh "A" bạn bao gồm có sự phụ thuộc vào hàm "B". Nếu sự phụ thuộc này không thể được thực hiện bởi hệ thống đích, thì chương trình của bạn sẽ không chạy. Tuy nhiên, nếu bạn đang sử dụng liên kết động, người dùng có thể cài đặt phiên bản khác của thư viện "A" sử dụng hàm "C" thay vì "B", để nó có thể chạy thành công.

+1

CÓ GÌ A *? Điều này hoàn toàn vô nghĩa. Nhị phân tĩnh được liên kết đầy đủ với tất cả mọi thứ nó cần. Bạn không có nhu cầu thư viện với những người. Làm thế nào để câu trả lời như vậy được chấp nhận ... – morphles

+1

@morphles: Một thư viện liên kết tĩnh không bao giờ có thể chứa tất cả mọi thứ * (nếu không, nó thậm chí sẽ phải bao gồm hạt nhân ;-) –

0

Với thư viện được liên kết động, nếu thư viện nói X, bạn đã liên kết với không có sẵn ở hệ thống người dùng, mã của bạn bị treo không đúng để lại người dùng cuối tự hỏi.
Trong khi đó, trong trường hợp thư viện tĩnh tất cả mọi thứ được hợp nhất vào thực thi, do đó, một điều kiện như trên có thể không xảy ra, tuy nhiên thực thi sẽ rất cồng kềnh.

Sự cố ở trên trong thư viện được liên kết động có thể được loại bỏ theo dynamic loading.

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