2012-05-10 12 views
15
  1. Come posso eliminare la dipendenza dinamica libgmp e passare da questo:staticamente Link GMP a un'applicazione Haskell utilizzando 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) 
    

    a questo (attualmente desiderato):

    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) 
    

    in modo pulito e portatile che funziona solo su tutte le distribuzioni GNU/Linux (e non scherzando con BSD (incluso OS X))?

  2. Vedete altre dipendenze che potrebbero causare problemi nell'elenco attualmente desiderato come indicato sopra quando distribuite un singolo binario Haskell che ha come target più distribuzioni GNU/Linux?


Note:

+0

Come si svolge il processo di distribuzione? In particolare cosa ti impedisce di implementare libgmp insieme alla tua applicazione? Cosa intendi per non incasinare su BSD incluso OSX? Non è possibile eseguire lo stesso binario su entrambi OSX e Linux. – asm

+0

@AndrewMyers Uso Cabal per le build. Distribuisci libgmp? Come? Voglio supportare almeno Windows, Linux, OS X e FreeBSD. Se devo creare una versione di libreria condivisa/dinamica di libgmp per ogni piattaforma per distribuirla insieme alla mia app, è troppo lavoro. Non rovinare: una soluzione che funziona preferibilmente non solo su un singolo sistema operativo; Stavo pensando a qualcuno che potrebbe suggerire di usare qualcosa come 'locate libgmp' e usare qualsiasi cosa possa tornare al momento del collegamento e' locate' si comporta in modo diverso su diversi SO. (Sostituisci 'locate' con qualsiasi altro strumento qui come desideri.) –

+0

Sembra che tu stia parlando della distribuzione di un binario, che dovrai costruire per ogni piattaforma. Dal momento che devi costruirlo per ogni piattaforma, devi avere comunque una versione di libgmp per ogni piattaforma in modo da poterlo semplicemente pacchettizzare con il tuo binario. Mi sto perdendo qualcosa su come hai intenzione di distribuire la tua applicazione? – asm

risposta

15

Se si passa -optl-static -optl-pthread a GHC, collegherà in modo statico tutte le dipendenze della libreria di runtime, inclusa GMP. L'impostazione di ld-options: -static -pthread nel file Cabal dovrebbe eseguire la stessa operazione.

Ciò significa che verrà eseguito il collegamento statico anche in glibc, ma probabilmente non sarà un problema, anche se potrebbe aumentare un po 'le dimensioni binarie. L'utilizzo di una libc alternativa come musl o uClibc dovrebbe aiutare a contrastarlo, se è un problema per te.

+2

Perché è necessario '-pthread'? –

+1

Non sono sicuro. L'ultima volta che ho collegato staticamente un programma con GHC, ho ricevuto degli errori relativi ai simboli pthread se non l'avessi passato. Potrebbe non essere più necessario. – ehird

+0

Ho appena collegato un'app il più staticamente possibile. ** Windows ** e ** OS X **: 'libgmp' è compilato staticamente. ** Linux **: '-static' per' ghc' e 'ld' è sufficiente senza' -pthread'; 'libc' è collegato staticamente ma avverte sul caricamento dinamico usato all'interno di' libc'. ** FreeBSD **: si lamenta sempre dei simboli 'pthread' se io uso' -pthread' o meno. –

Problemi correlati