2015-08-17 11 views
7

Meine Frage kommt in zwei Teile. Die erste ist, dass, wenn ich mein Projekt kompilieren ich eine lange Liste von Fehlern des Formulars erhaltenHaskell Cabal Build undefined Referenzfehler und doppelte Neukompilierung

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

Die vollständige Liste der Fehler here Der Code, der diesen Fehler erzeugt gefunden werden kann, kann here gefunden werden.

Ich benutze ghc 7.10.1 und cabal 1.22.4.0.

Der zweite Teil meiner Frage ist, dass die gleiche Clique Struktur wie this question trotz folgenden, Kabalen immer noch die Bibliothek jeweils 3 Mal Kabale Build trotz der ausführbaren Dateien neu kompilieren und die Bibliothek alle auf der Bibliothek ein einzigartiges hs-source-dir und abhängig ist.

EDIT: soweit die Dreifach-Compilation betroffen ist, baut das erste Mal .o Dateien [ 2 of 15] Compiling Types (src/Types.hs, dist/build/Types.o). Das zweite Mal erstellt .p_o Dateien [ 2 of 15] Compiling Types (src/Types.hs, dist/build/Types.p_o), die von TemplateHaskell und Profiling verursacht werden.

+3

Sie sollten alle anderen nicht exportierten Module in Ihrer Cabal-Datei in das Feld 'other-modules' einbeziehen - behebt dies Ihr Verknüpfungsproblem? (Ich kann mich selbst nicht testen, da ich immer noch auf 7.8.3 bin, also kann ich Ihren Code nicht erstellen.) –

+0

Es sieht so aus, als behebe das nicht definierte Referenzproblem funktioniert <3 <3 <3. –

+0

@ AntalSpector-Zabusky wie dies das Problem gelöst, sollten Sie es als Antwort posten :-) – sclv

Antwort

6

Sie sollten alle anderen nicht exportierten Module in Ihre Cabal-Datei im Feld other-modules einschließen, andernfalls werden sie bei der Erstellung der endgültigen Bibliothek oder ausführbaren Datei nicht ordnungsgemäß verknüpft.

Sie können the Cabal User's Guide für weitere Informationen sehen (obwohl das ziemlich viel die Situation mit other-modules zusammenfasst!).

+0

Zunächst tut mir leid, für das Posten in einem Kommentar, aber ich lief in eine ähnliche Situation als der Fragesteller. Ich benutze eine externe Bibliothek namens ** gstreamer ** für das Haskell-Paket ** haskell-gi **. Jetzt läuft der Linker in mehrere ** undefinierte Referenz ** Probleme. Beispiel: ** "undefinierter Verweis auf' g_irepository_require '"**. Diese Methode ist Teil einer .c- oder .h-Datei, die als gi-repository.c/gi-repository.h bezeichnet wird. Ich habe das Benutzerhandbuch von Cabals durchgesehen, habe aber immer noch keine Ahnung, wie ich diese Datei zu ** "anderen Modulen" ** hinzufügen kann. Kannst du mir ein Beispiel geben? – oRole

+0

@oRole: Da dies eine C-Funktion ist, behandeln Sie es anders - diese Antwort befasst sich speziell mit Haskell-Code. Ich habe keine schnelle Antwort, also solltest du [eine neue Frage stellen!] (Https://stackoverflow.com/questions/ask) :-) –

+0

Danke trotzdem! – oRole

Verwandte Themen