2012-05-10 29 views
15
  1. Làm thế nào tôi có thể thả phụ thuộc động trên libgmp và đi từ này:Tĩnh liên kết GMP đến một ứng dụng Haskell sử dụng GHC (+ LLVM)

    linux-vdso.so.1 => (0x00007fffdccb1000) 
    libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fb01afc1000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb01acc7000) 
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb01aabe000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb01a8ba000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb01a69d000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb01a2df000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007fb01b249000) 
    

    này (hiện mong muốn):

    linux-vdso.so.1 => (0x00007fffdccb1000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb01acc7000) 
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb01aabe000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb01a8ba000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb01a69d000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb01a2df000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007fb01b249000) 
    

    một cách sạch sẽ và di động chỉ hoạt động trên tất cả các bản phân phối GNU/Linux (và không gây rối với BSD (bao gồm OS X))?

  2. Bạn có thấy bất kỳ phụ thuộc nào khác có thể gây ra sự cố trong danh sách hiện tại mong muốn như đã nêu ở trên khi phân phối một phân tách cú pháp Haskell duy nhất cho nhiều bản phân phối GNU/Linux không?


Ghi chú:

+0

Quy trình triển khai của bạn như thế nào? Cụ thể những gì ngăn cản bạn triển khai libgmp cùng với ứng dụng của bạn? Điều gì làm bạn có nghĩa là không rối tung lên BSDs bao gồm OSX? Bạn không thể chạy cùng một nhị phân trên cả OSX và Linux. – asm

+0

@AndrewMyers Tôi sử dụng Cabal để xây dựng. Triển khai libgmp? Làm sao? Tôi muốn hỗ trợ ít nhất Windows, Linux, OS X và FreeBSD. Nếu tôi cần xây dựng một phiên bản thư viện chia sẻ/động của libgmp cho mỗi nền tảng để triển khai nó cùng với ứng dụng của tôi, đó chỉ là quá nhiều công việc. Không lộn xộn: một giải pháp hoạt động tốt nhất không chỉ trên một hệ điều hành duy nhất; đã suy nghĩ của một ai đó có thể gợi ý sử dụng một cái gì đó như 'xác định vị trí libgmp' và sử dụng bất cứ điều gì nó có thể trở lại tại thời gian liên kết và' xác định vị trí' hành xử khác nhau trên hệ điều hành khác nhau. (Thay thế 'định vị' bằng bất kỳ công cụ nào khác ở đây như bạn muốn.) –

+0

Có vẻ như bạn đang nói về việc triển khai một tệp nhị phân, mà bạn sẽ phải xây dựng cho mỗi nền tảng. Vì bạn phải xây dựng nó cho mỗi nền tảng, bạn phải có một phiên bản của libgmp cho mỗi nền tảng anyway, do đó bạn chỉ có thể gói này với nhị phân của bạn. Tôi có thiếu điều gì đó về cách bạn định phân phối ứng dụng của mình không? – asm

Trả lời

15

Nếu bạn vượt qua -optl-static -optl-pthread tới GHC, nó sẽ liên kết tĩnh tất cả các phụ thuộc thư viện thời gian chạy, bao gồm GMP. Thiết lập ld-options: -static -pthread trong tệp Cabal của bạn sẽ hoàn thành điều tương tự.

Điều đó có nghĩa là bạn sẽ liên kết tĩnh trong glibc, nhưng điều đó có thể sẽ không thành vấn đề, mặc dù nó có thể tăng kích thước nhị phân một chút. Sử dụng một libc thay thế như musl hoặc uClibc sẽ giúp chống lại điều đó, nếu đó là vấn đề cho bạn.

+2

Tại sao người ta cần '-pthread'? –

+1

Tôi không chắc chắn. Lần cuối cùng tôi liên kết tĩnh một chương trình với GHC, tôi gặp lỗi liên quan đến các biểu tượng pthread nếu tôi không vượt qua nó. Nó có thể không cần thiết nữa. – ehird

+0

Tôi vừa liên kết ứng dụng với mức độ tĩnh nhất có thể. ** Windows ** và ** OS X **: 'libgmp' được biên dịch tĩnh. ** Linux **: '-static' cho' ghc' và 'ld' là đủ mà không có' -pthread'; 'libc' được liên kết tĩnh nhưng cảnh báo về tải động được sử dụng bên trong' libc'. ** FreeBSD **: luôn phàn nàn về các ký hiệu 'pthread' cho dù tôi có sử dụng' -pthread' hay không. –

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