6

Tại sao không cabal install sử dụng cờ - có thể chia sẻ theo mặc định? Tôi đã nhận thấy rằng các chương trình tầm thường khi được biên dịch mà không có cờ này, có kích thước tệp lớn. Có kết nối không? Đây có phải là một lựa chọn thiết kế liên quan đến cách các chương trình Haskell được đề xuất để dễ dàng triển khai trong một bản nhị phân độc lập không?Haskell Tĩnh và liên kết động trong triển khai

+1

ISTR hỗ trợ thư viện được chia sẻ là khá mới và không hoạt động trên tất cả các nền tảng, cũng khiến việc phân phối tệp thi hành trở nên khó khăn hơn. Và không gian rẻ, vậy ai quan tâm? Sẽ có một câu trả lời tốt hơn mặc dù. – luqui

+1

@luqui: Không gian có thể rẻ, nhưng băng thông thì sao? Điều gì xảy ra nếu bạn cần cập nhật chương trình 20MB qua Internet, cho những khách hàng có kết nối ít hơn lý tưởng? –

+0

cũng thấy [GHC Docs on "Sử dụng thư viện được chia sẻ"] (http://downloads.haskell.org/~ghc/7.8.4/docs/html/users_guide/using-shared-libs.html) – mb21

Trả lời

4

Tôi nghĩ rằng điều đó liên quan đến việc thiếu sự hỗ trợ. Tuy nhiên, tôi không thể có được câu trả lời thẳng về việc liệu GHC hiện có hỗ trợ liên kết động hay không. Trang wiki của GHC SharedLibraries/PlatformSupport là hai tuổi.

Trên Windows, tôi đã thử xây dựng một loạt gói với --enable-shared, bao gồm một chương trình đơn giản mà tôi đã viết sử dụng http-enumerator để tải xuống từ URL sau mỗi 30 giây. Khi tôi chạy chương trình (sau khi đặt tất cả các DLL trong một thư mục với chương trình của tôi), nó bị phân đoạn sau một vài giây. Khi tôi biên soạn với --threaded, nó bị phân đoạn ngay lập tức.

Tôi đã thử điều này trong GHC 7.0.3. A documentation page for that version nói:

Làm thư viện Haskell thành DLL không hoạt động trên Windows tại thời điểm này; chúng tôi hy vọng sẽ khôi phục lại cơ sở này trong tương lai (xem Phần 4.12, “Sử dụng thư viện được chia sẻ”). ...

Thông báo này không xuất hiện trong các phiên bản sau.


Bằng cách này, có một rắc rối khác đối với tệp nhị phân tĩnh bên cạnh kích thước mã. GHC sử dụng GMP để được hỗ trợ số nguyên lớn. GMP được cấp phép theo LGPL. Điều này có nghĩa là nếu bạn cần phân phối nhị phân độc quyền hoặc nếu bạn có sự phụ thuộc không tương thích với GPL (ví dụ: OpenSSL), bạn sẽ cần phải phân phối tệp đối tượng của mình để tuân thủ giấy phép của GMP. Hoặc là, hoặc tìm cách để libgmp được liên kết động. Tôi muốn biết làm thế nào để làm điều đó.

+1

trả lời câu trả lời này vẫn giữ đến tháng 3 năm 2015? –