2014-10-19 11 views
10

Ho la seguente situazione:Una soluzione alternativa per il bug "Template Haskell + C"?

  • Library X è un wrapper su un certo codice in C.
  • Library A dipende biblioteca X.
  • Library B usa Template Haskell e dipende biblioteca A.

GHC bug #9010 rende impossibile installare la libreria B utilizzando GHC 7.6. Quando TH viene elaborato, GHCi spara e tenta di caricare X biblioteca, che non riesce con un messaggio come

Loading package charsetdetect-ae-1.0 ... linking ... ghc: 
~/.cabal/lib/x86_64-linux-ghc-7.6.3/charsetdetect-ae-1.0/ 
libHScharsetdetect-ae-1.0.a: unknown symbol `_ZTV15nsCharSetProber' 

(il nome effettivo del “simbolo sconosciuto” si differenzia da macchina a macchina).

Esistono soluzioni alternative per questo problema (ad eccezione di "non utilizzare Template Haskell", ovviamente)? Forse la libreria X deve essere compilata in modo diverso, o c'è un modo per impedirne il caricamento (come non dovrebbe essere chiamato durante la generazione del codice)?

+0

Aggiungi 'opzione -lyourlibname' a ghci dove libyourlibname.so è le coperture libreria X. –

+0

@ n.m. Non c'è 'libyourlibname.so' - tutto il codice che è incapsulato dalla libreria X è contenuto nella libreria X stessa. – Artyom

+0

Hm, sembra che tu abbia ragione. Il simbolo è sconosciuto, non indefinito. –

risposta

4

Questo è davvero uno dei motivi principali per cui il 7.8 è passato al GHCi dinamico per impostazione predefinita. Anziché provare a supportare tutte le funzionalità di ogni formato di file oggetto, crea librerie dinamiche e consente al caricatore dinamico del sistema di gestirle.

Provare a costruire con l'opzione g ++ -fno-weak. Dalla pagina man g ++:

-fno-debole

Non utilizzare il supporto simbolo debole, anche se esso è fornito dalla linker. Per impostazione predefinita, G ++ utilizzerà simboli deboli se disponibili. Questa opzione esiste solo per i test e non deve essere utilizzata dagli utenti finali; comporterà un codice inferiore e non ha benefici. Questa opzione può essere rimossa in una versione futura di G ++.

C'è un altro problema con __dso_handle. Ho scoperto che puoi almeno caricare la libreria e apparentemente lavorare collegando un file che definisce quel simbolo. Non so se questo hack farà sì che qualcosa vada storto.

Quindi, in X.cabal aggiungere

if impl(ghc < 7.8) 
    cc-option: -fno-weak 
    c-sources: cbits/dso_handle.c 

dove cbits/dso_handle.c contiene

void *__dso_handle; 
Problemi correlati