2016-01-07 7 views
12

Ich verwalte ein Open-Source-Framework, das CircleCI für die kontinuierliche Integration verwendet. Ich habe kürzlich eine Wand getroffen, wo das Projekt sich plötzlich weigerte, ziemlich seltsame Umstände einzubauen.Build schlägt aufgrund von "multiple definition" -Linkerfehlern in nativen Abhängigkeiten fehl

Build 27 war die letzte, die erfolgreich war. Danach habe ich einige kleine Änderungen an den Abhängigkeiten vorgenommen und festgestellt, dass der Build fehlschlägt. Ich habe versucht, es ohne Erfolg zu beheben, also kehrte ich zur letzten funktionierenden Konfiguration and it still failed zurück.

Der Grund für den Fehler sind zwei Abhängigkeiten, die beide Bindungen zu nativen C-Bibliotheken sind: OpenGL (OpenGLRaw) und GLFW (bindings-glfw). Sie Fehler in Link-Phase mit zahlreichen Zeilen:

/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 

Ich bin völlig ratlos, warum das passieren könnte. Die genau gleichen Versionen dieser Bibliotheken wurden zurückgebaut, als der ursprüngliche Build bestanden wurde, und auf CI verwendet es jedes Mal einen neuen Container (ich habe versucht, den Cache offensichtlich zu säubern). Die Erstellung umfasst sowohl apt-get update als auch cabal update, daher besteht die Möglichkeit, dass eine externe Ressource geändert wurde.

Wenn jemals jemand auf ein solches oder ähnliches Problem gestoßen ist, kann es sehr hilfreich bei der Diagnose und Beseitigung des Problems sein. Google-Suche nach diesem spezifischen multiple definition Problem dieser Skala ergibt nichts.


Ich habe versucht, Kabale Version zu aktualisieren (da einige Hinweise über das Internet an darauf hingewiesen), aber mit:

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

Das Problem weiterhin besteht.


Eine wichtige Sache, die ich vergessen zu erwähnen, ist, dass dies nicht streng wie einige einfache Paket Verwechslung aussieht. Ich verband über SSH mit dieser Box, erstellte dort einen leeren Ordner und eine Sandbox, und sogar einfach cabal install OpenGLRaw scheiterte mit dem gleichen Problem (so ist es unwahrscheinlich, dass das selbst zwei Versionen des gleichen Moduls einziehen würde, die diese Konflikte verursachen könnten).


I've also extracted a verbose cabal installation log.


Hat SSH wieder geklont rohe Quellen von OpenGLRaw, immer noch das gleiche. Versucht 7.6.3, immer noch dasselbe.

+1

Ich habe ein ähnliches Problem (auch mit CircleCI), aber mit 'Direkt SQLite-2.3.16'. – jpvillaisaza

+2

Irgendwas Glück? Es scheint, als ob dasselbe für 'hslua' passiert. Siehe https://github.com/commercialhaskell/stack/issues/1624 und https://github.com/osa1/hslua/issues/40. – jpvillaisaza

+1

@jpvillaisaza Ich bin eskaliert, wo immer ich konnte; vielleicht außer Haskell reddit. Zeit, das Kopfgeld hier hochzulegen und auf das Beste zu hoffen. –

Antwort

13

Es scheint ein Problem mit gcc-4.9.2 zu sein. Ich habe dein Projekt gegabelt, eine build with high verbosity level gestartet, bin mit dem Circleci-Container verbunden und führe den exakten Linkbefehl aus. Es schlägt fehl, auf die gleiche Weise:

[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 

Aber mit gcc-4.8 es funktioniert:

[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]:~$ 

So sollten Sie wechseln ältere gcc und wahrscheinlich einen Fehler gcc Devs melden.

HINZUGEFÜGT:Here ist ein Beispiel, wie gcc Version zu wechseln.Und here ist ein erfolgreicher Build.

+2

Das ist einfach unglaublich. Ich danke dir sehr! –

+0

Es funktioniert auch für mich. Vielen Dank! – jpvillaisaza

+2

Vielen Dank dafür. Ich habe meinen Kopf gegen dieses Problem geschlagen und versucht, HsOpenSSL jetzt für ein paar Tage zu bauen! – mightybyte