2016-01-07 31 views
12

Mantengo un framework open source che utilizza CircleCI per l'integrazione continua. Di recente ho colpito un muro in cui il progetto si è improvvisamente rifiutato di costruire in circostanze piuttosto strane.La compilazione non riesce a causa di errori di linker "a definizione multipla" nelle dipendenze native

Build 27 è stato l'ultimo ad esserci riuscito. Dopo di ciò, ho apportato alcune modifiche minori alle dipendenze e ho notato che la compilazione fallisce. Ho provato a risolverlo senza successo, quindi sono tornato all'ultima configurazione di lavoro and it still failed.

Il motivo dell'errore sono due dipendenze, essendo entrambi collegamenti alle librerie C native: OpenGL (OpenGLRaw) e GLFW (bindings-glfw). Errore nella fase di collegamento con numerose righe di:

/tmp/ghc18975_0/ghc18975_6.o:(.data+0x0): multiple definition of `__stginit_bindizu0Qm7f8FzzUN32WFlos7AKUm_BindingsziGLFW' 
/tmp/ghc18975_0/ghc18975_6.o:(.data+0x0): first defined here 

Sono totalmente perplesso sul motivo per cui ciò potrebbe accadere. Le stesse identiche versioni di quelle librerie sono state ricostruite quando la generazione originale è passata, ed essendo in CI usa ogni volta un container nuovo (ho provato a pulire la cache ovviamente). La build coinvolge sia apt-get update sia cabal update, quindi c'è la possibilità che alcune risorse esterne siano state modificate.

Se qualcuno ha mai riscontrato un problema simile o simile, potrebbe essere di grande aiuto nella diagnosi e nella rimozione del problema. Ricerca Google per questo specifico problema multiple definition di questa scala non produce nulla.


ho cercato di aggiornare la versione cabala (dal momento che alcuni suggerimenti su internet puntato verso di esso), ma con:

cabal-install version 1.22.6.0 
using version 1.22.4.0 of the Cabal library 

il problema persiste.


Una cosa importante che ho dimenticato di menzionare è che questo non sembra esattamente come un semplice mix di pacchetti. Mi sono collegato tramite SSH a quella casella, ho creato una cartella vuota e una sandbox, e anche il semplice cabal install OpenGLRaw non è riuscito con lo stesso problema (quindi è improbabile che ciò accolga due versioni dello stesso modulo che potrebbero causare tali conflitti).


I've also extracted a verbose cabal installation log.


Ancora SSH, clonazione di origini raw di OpenGLRaw, sempre uguale. Provato 7.6.3, sempre lo stesso.

+1

Ho un problema simile (anche con CircleCI), ma con 'direct-sqlite-2.3.16'. – jpvillaisaza

+2

Qualche fortuna? Sembra che lo stesso accada per 'hslua'. Vedi https://github.com/commercialhaskell/stack/issues/1624 e https://github.com/osa1/hslua/issues/40. – jpvillaisaza

+1

@jpvillaisaza Mi sono avvicinato a qualsiasi posto dove potevo; forse ad eccezione di Haskell reddit. È ora di mettere la taglia qui e sperare per il meglio. –

risposta

13

Sembra essere un problema con gcc-4.9.2. Ho biforcato il tuo progetto, avviato un build with high verbosity level, connesso al contenitore circleci ed eseguito il comando di collegamento esatto. Non riesce allo stesso modo:

[email protected]:~$ /usr/bin/gcc -fno-stack-protector -DTABLES_NEXT_TO_CODE '-Wl,--hash-size=31' -Wl,--reduce-memory-overheads -Wl,--no-as-needed -nostdlib -Wl,-r -nodefaultlibs '-Wl,--build-id=none' -o Types.o /tmp/ghc17998_0/ghc_15.ldscript 
/tmp/ghc17998_0/ghc_14.o: In function `r2vy_closure': 
(.data+0x0): multiple definition of `__stginit_OpenGzu8rT20eO9AxEKIONeYf57cS_GraphicsziRenderingziOpenGLziRawziTypes' 
/tmp/ghc17998_0/ghc_14.o:(.data+0x0): first defined here 
/tmp/ghc17998_0/ghc_14.o: In function `r2vy_closure': 
(.data+0x8): multiple definition of `OpenGzu8rT20eO9AxEKIONeYf57cS_GraphicsziRenderingziOpenGLziRawziTypes_makeGLDEBUGPROC_closure' 
/tmp/ghc17998_0/ghc_14.o:(.data+0x8): first defined here 
/tmp/ghc17998_0/ghc_14.o: In function `c2y7_info': 
(.text+0xc0): multiple definition of `OpenGzu8rT20eO9AxEKIONeYf57cS_GraphicsziRenderingziOpenGLziRawziTypes_makeGLDEBUGPROC_info' 
/tmp/ghc17998_0/ghc_14.o:(.text+0xc0): first defined here 

Ma con gcc-4.8 funziona:

[email protected]:~$ /usr/bin/gcc-4.8 -fno-stack-protector -DTABLES_NEXT_TO_CODE '-Wl,--hash-size=31' -Wl,--reduce-memory-overheads -Wl,--no-as-needed -nostdlib -Wl,-r -nodefaultlibs '-Wl,--build-id=none' -o Types.o /tmp/ghc17998_0/ghc_15.ldscript 
[email protected]:~$ 

così si dovrebbe passare ad anziani gcc e probabilmente segnalare un bug per gcc sviluppatori.

AGGIUNTO:Here è un esempio di come passare alla versione gcc.E here è una build di successo.

+2

Questo è semplicemente fantastico. Grazie mille! –

+0

Funziona anche per me. Grazie! – jpvillaisaza

+2

Grazie mille per questo. Ho battuto la testa contro questo problema cercando di costruire HsOpenSSL per un paio di giorni! – mightybyte

Problemi correlati