2015-08-17 8 views
7

La mia domanda è suddivisa in due parti. La prima è che quando ho compilare il mio progetto ho una lunga lista di errori del moduloLa cabala di Haskell crea un errore di riferimento non definito e duplica la ricompilazione

(.text+0x137f): undefined reference to `raytrzuAd6RComi0WmBiuT4685WWH_Types_zdfBinaryColor_closure' 

L'elenco completo degli errori può essere trovato here Il codice che genera questo errore può essere trovato here.

Sto utilizzando ghc 7.10.1 e cabal 1.22.4.0.

La seconda parte della mia domanda è che, nonostante seguendo la stessa struttura cabala come this question, cabala ricompila ancora biblioteca 3 volte ogni generazione cabala, nonostante gli eseguibili e la biblioteca tutti con un unico hs-source-dir e in funzione della biblioteca.

MODIFICA: per quanto riguarda la compilazione tripla, la prima volta che crea file .o[ 2 of 15] Compiling Types (src/Types.hs, dist/build/Types.o). La seconda volta crea file .p_o[ 2 of 15] Compiling Types (src/Types.hs, dist/build/Types.p_o) causati da TemplateHaskell e profiling.

+3

Dovresti includere tutti gli altri moduli non esportati nel tuo file Cabal nel campo 'other-modules' - questo risolve il tuo problema di collegamento? (Non riesco a mettermi alla prova visto che sono ancora in 7.8.3, quindi non riesco a creare il tuo codice.) –

+0

Sembra che risolva il problema di riferimento non definito che funziona <3 <3 <3. –

+0

@ AntalSpector-Zabusky come questo ha risolto il problema, dovresti postarlo come risposta :-) – sclv

risposta

6

È necessario includere tutti gli altri moduli non esportati nel file Cabal nel campo other-modules, altrimenti non verranno collegati correttamente durante la produzione della libreria finale o dell'eseguibile.

È possibile visualizzare the Cabal User's Guide per ulteriori informazioni (anche se questo praticamente riassume la situazione con other-modules!).

+0

Prima di tutto, scusa per aver postato questo in un commento, ma mi sono imbattuto in una situazione simile come l'interrogante. Sto usando una libreria esterna chiamata ** gstreamer ** per il pacchetto haskell ** haskell-gi **. Ora il linker viene eseguito in diversi problemi ** di riferimento non definito **. Esempio: ** "riferimento non definito a 'g_irepository_require'" **. Questo metodo fa parte di un file .c o .h, chiamato gi-repository.c/gi-repository.h. Ho esaminato la Guida per l'utente di Cabals, ma ancora non ho idea di come aggiungere quel file a ** "altri moduli" **. Puoi farmi un esempio? – oRole

+0

@oRole: Poiché si tratta di una funzione C, la gestisci in modo diverso: questa risposta si riferisce in modo specifico al codice Haskell. Non ho una risposta veloce, quindi dovresti [fare una nuova domanda!] (Https://stackoverflow.com/questions/ask) :-) –

+0

Grazie comunque! – oRole

Problemi correlati