kostenloser Webspace werbefrei: lima-city


D - SDL Link Error

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    s******i

    Hallo,
    ich habe mir die derelict-Bindungen für SDL, OpenGL und Co. runtergeladen um ein paar tag/programm">Programme in SDL zu schreiben. Das Problem ist nur, dass trotz dem Versuch, die Datei mit SDL zu linken dieser Error auftaucht:
    /tmp/ccHvFL2E.o:(.data+0x3c): undefined reference to `_D8derelict3sdl3sdl12__ModuleInfoZ'


    Hier meine Terminal-Eingabe:
    gdc-4.3 -L /usr/lib/libSDL.a  hello.d


    ist das die falsche zu linkende Datei, oder fehlen noch welche?

    Laut d.whosme.de hätte ich eigl. nur die Bibliothek (auf Windows SDL.dll, auf meiner Distri (Ubuntu) libSDL.so, libSDL.a) mit meinem Programm zu linken.

    Ich bin folgender maßen vorgegangen:
    1. Download von derelict auf dsource.org
    2. Zusammenführen der relevanten Ordner in den Ordner derelict (Wie im Tutorial beschrieben)
    3. Den Ordner in den Compiler-Include-Standard-Ordner hinein kopiert.

    Beitrag zuletzt geändert: 29.5.2011 10:21:02 von spuglisi
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo spuglisi,

    auf der derelict-Seite steht:
    ...
    Derelict applications compiled on Linux have a dependency on libdl, so you will need to tell your build tool to link with that library when compiling.
    ...
    Also musst Du wohl noch ein -ldl hinzugügen.
    Kleine Frage am Rande:
    Ich dachte immer '-L' fügt nur einen Suchpfad für den Linker hinzu und '-l' (kleines L) gibt die zu bindende Bibliothek an?
    Laut gcc man-Page ist das auch immer noch so.
    Sollte es dann nicht eigentlich
    gdc-4.3 -lSDL -ldl  hello.d
    heißen?
  4. Autor dieses Themas

    s******i

    Das kann sehr gut sein :-) Ich werde es gleich mal testen

    EDIT: Hm. Scheint immer noch nicht zu funktionieren. Aber jetzt findet er zumindest die Lib.

    Beitrag zuletzt geändert: 29.5.2011 17:20:13 von spuglisi
  5. Ich habe mich mit dem Problem beschäftigt. Habe aber noch keine Lösung gefunden. Das Problem ist jedenfalls reproduzierbar :wink:

    Die große Frage ist eben, welche Parameter an den Linker übergeben werden müssen.

    Bei dmd bedeutet der -L Option, dass der Parameter an den Linker weitergegeben wird. Wenn man also gegen die libdl linken will, muss man schreiben dmd -L-ldl wobei -l dann die Option an den Linker ist und dl der Wert.

    edit: Hattest du vorher nicht dmd statt gdc stehen? Ich habe es eh mit beiden Compilern schon versucht mit ähnlichen Fehlermeldungen.

    Beitrag zuletzt geändert: 29.5.2011 19:43:43 von bladehunter
  6. Autor dieses Themas

    s******i

    Ich hatte vorher nur den gdc-Compiler auf dem Rechner, jetzt habe ich aber dmd nachinstalliert, mit bisher keinem Erfolg :-(
    Ach noch was: ich hab's mit Derelict2 probiert.
  7. Hallo spuglisi,

    ich habe gerade gesehen, dass man libDerelictUtil.a auch noch braucht. Damit wären wir dann schon bei:
    gdc-4.3 -lSDL -ldl -lDerelictUtil  hello.d


    Edit: Link korrigiert.

    Beitrag zuletzt geändert: 30.5.2011 22:03:03 von darkpandemic
  8. -lDerelictSDL

    Müsste auch noch mit von der Partie sein. Aber der entscheidene Linker-Parameter scheint immer noch zu fehlen.
  9. Autor dieses Themas

    s******i

    Ich nutze jetzt nur noch dmd, doch wo finde ich denn diese Libs? Anscheinend sucht der gdc-Compiler die libs automatisch, da man nicht den Pfad eingeben muss??

    Beitrag zuletzt geändert: 29.5.2011 22:10:07 von spuglisi
  10. Weder dmd noch gdc suchen weiträumig nach den Libs. Sie haben beide ihre Library-Pfade (und auch Include-Pfade) wo sie nachschauen. Aber darüber hinaus wird nichts betrachtet, falls man nicht explizit mit weitere Pfade auf der Kommandozeile angibt.

    > dmd -I/usr/include/d2/ -L-ldl -L-lDerelictUtil -L-lDerelictSDL -L-lSDL sdltest.d
    /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../libDerelictSDL.a(sdl.o):(.data+0x18): undefined reference to `_D8derelict4util6loader12__ModuleInfoZ'
    /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../libDerelictSDL.a(sdl_1_666.o):(.data+0x38): undefined reference to `_D8derelict4util6loader15SharedLibLoader7__ClassZ'
    /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../libDerelictSDL.a(sdl_1_666.o):(.rodata+0x14d8): undefined reference to `_D8derelict4util6loader15SharedLibLoader4loadMFZv'
    /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../libDerelictSDL.a(sdl_1_666.o):(.rodata+0x14dc): undefined reference to `_D8derelict4util6loader15SharedLibLoader4loadMFAyaZv'
    /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../libDerelictSDL.a(sdl_1_666.o):(.rodata+0x14e0): undefined reference to `_D8derelict4util6loader15SharedLibLoader4loadMFAAyaZv'
    /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../libDerelictSDL.a(sdl_1_666.o):(.rodata+0x14e4): undefined reference to `_D8derelict4util6loader15SharedLibLoader6unloadMFZv'
    /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../libDerelictSDL.a(sdl_1_666.o):(.rodata+0x14e8): undefined reference to `_D8derelict4util6loader15SharedLibLoader8isLoadedMFZb'
    /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../libDerelictSDL.a(sdl_1_666.o):(.rodata+0x14f0): undefined reference to `_D8derelict4util6loader15SharedLibLoader10loadSymbolMFAyaZPv'
    /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../libDerelictSDL.a(sdl_1_666.o):(.rodata+0x14f4): undefined reference to `_D8derelict4util6loader15SharedLibLoader3libMFZC8derelict4util9sharedlib9SharedLib'
    /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../libDerelictSDL.a(sdl_1_666.o):(.rodata+0x14f8): undefined reference to `_D8derelict4util6loader15SharedLibLoader8bindFuncMFPPvAyabZv'
    /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../libDerelictSDL.a(sdl_1_666.o): In function `_D8derelict3sdl3sdl17DerelictSDLLoader6__ctorMFZC8derelict3sdl3sdl17DerelictSDLLoader':
    (.text._D8derelict3sdl3sdl17DerelictSDLLoader6__ctorMFZC8derelict3sdl3sdl17DerelictSDLLoader+0x2e): undefined reference to `_D8derelict4util6loader15SharedLibLoader6__ctorMFAyaAyaAyaZC8derelict4util6loader15SharedLibLoader'
    /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../libDerelictSDL.a(sdlfuncs.o):(.data+0xc): undefined reference to `_D8derelict4util6compat12__ModuleInfoZ'
    collect2: ld gab 1 als Ende-Status zurück
    --- errorlevel 1


    > gdc -I/usr/include/d2/ -ldl -lDerelictUtil -lDerelictSDL -lSDL sdltest.d
    /tmp/ccX5650n.o:(.data+0x10): undefined reference to `_D8derelict3sdl3sdl12__ModuleInfoZ'


    Die -I Include-Parameter scheinen bei dir ja nicht notwendig zu sein.
  11. Autor dieses Themas

    s******i

    Diese Lib habe ich nicht: /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../libDerelictSDL.a.
    Muss ich die erst kompilieren? Ich meine ich habe ja den ganzen Sorucecode und keine einzige Lib runtergeladen (Es gab keine Lib). Da finde ich es komisch, dass eine benötigt wird.
  12. Ich habe mich mit D noch nicht all zu ausführlich beschäftigt, aber ich will hier mal eine eventuelle analogie zu C++ aufrgreifen.
    Ich gehe davon aus, dass die Lib, die du einbinden willst in C, bestenfalls C++ geschrieben ist.
    Wahrscheinlich werden die Symbolnamen in D aber anders übersetzt.
    Ich hatte mal dieses Problem mit einem C++ Programm, dass eine C Bibliothek verwendete.
    Die Lösung war in meinem Fall beim Includen der Bibliothek hinzuschreiben:
    extern "C" {
    #include <bla.h>
    }


    Vielleicht gibt es ja in D ein ähnliches Konstrukt?
  13. spuglisi schrieb:
    Diese Lib habe ich nicht: /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../libDerelictSDL.a.
    Muss ich die erst kompilieren? Ich meine ich habe ja den ganzen Sorucecode und keine einzige Lib runtergeladen (Es gab keine Lib). Da finde ich es komisch, dass eine benötigt wird.

    Mach nochmal nen
    locate libDerelict.a

    denn es kann gut sein, dass die libs in deinem System woanders liegen. Falls du eine 64-bit CPU hast, wirst du logischerweise auch keinen i686-pc-linux-gnu Ordner haben :wink:

    Die Lib ist jedenfalls teil von Derelict und wurde entsprechend mitinstalliert. Aber ich denke wir sollten erstmal versuchen das ModuleInfo Dingens vernünftig zu linken. Die Fehlermeldung kommt schließlich mit beiden Compilern.

    sektor schrieb:
    Ich gehe davon aus, dass die Lib, die du einbinden willst in C, bestenfalls C++ geschrieben ist.

    Hallo sektor,

    das ist nicht der Fall. Zwar sind SDL etc. in C geschrieben, aber Derelict (also das was hier verwendet werden soll) bietet extra D-Bindings für diese Bibliotheken an, so dass man damit keine Probleme haben sollte. Und die Linker-Meldungen beziehen sich auch eindeutig auf Derelict-Komponenten.


    Wahrscheinlich werden die Symbolnamen in D aber anders übersetzt.
    Ich hatte mal dieses Problem mit einem C++ Programm, dass eine C Bibliothek verwendete.
    Die Lösung war in meinem Fall beim Includen der Bibliothek hinzuschreiben:
    extern "C" {
    #include <bla.h>
    }


    Vielleicht gibt es ja in D ein ähnliches Konstrukt?

    Hat es. Heißt auch extern und unterstützt C und teilweise C++ (keine Template-Funktionen).
  14. Autor dieses Themas

    s******i

    Ich habe DerekictSDL nicht "installiert" sondern manuell die zweite Version heruntergeladen und entsprechend entpackt. Da war keine einzige lib-File zu sehen. (Warum denn auch, in D wird ja meistens in eine File geschrieben, und es gibt keine dpp-Datei)
  15. Hallo spuglisi,

    laut Dokumentation muss man die Libraries aber kompilieren:
    http://svn.dsource.org/projects/derelict/branches/Derelict2/doc/build.html

    Edit: Link korrigiert.

    Beitrag zuletzt geändert: 30.5.2011 22:01:43 von darkpandemic
  16. Autor dieses Themas

    s******i

    Also ich hab mir jetzt einfach das tolle dsss heruntergeladen, und builde einfach meine projekte mit dsss build main.d. Hab das aber erstmal auf dem Windows rechener gemacht. Ich werde in den nächsten Tagen mal schauen, wie ich das auf dem Linux hin bekomme. aber da es dsss auch für linux-distris gibt, werde ich wohl keine großen probleme haben.


    Aber da habe ich doch noch mal eine Frage: Warum muss ich eine Lib erstellen, wenn der gesammte code in den include-dateien steht?? Ich meine, um eine Lib zu erstellen muss doch der ganze code vorhanden sein, dass heißt für mich wiederum, dass ich nichts linken muss (nicht so wie in c/c++, da hatte man ja header und definitionsdatei)
  17. Derelict bringt selber auch etwas Funktionalität mit. Es ist ja nicht nur einfach eine Sammlung von Bindings, sondern Derelict erlaubt es dir auch zur Laufzeit Libs nachzuladen und dabei dann auch dynamisch das Subsystem zu nutzen, was auf dem lokalem Rechner unterstützt wird. Von daher ist es (nach meinem Verständnis) schon sinnvoll, dass diese Funktionalität in eine eigene Library eingebettet ist.

    Beitrag zuletzt geändert: 31.5.2011 18:51:01 von bladehunter
  18. Hallo spuglisi,

    im Allgemeinen kann man natürlich auch den Code direkt in das Projekt aufnehmen. Aber es kann halt mit der Zeit lästig werden, ständig alle Dateien herumzukopieren. Wenn man eine Bibliothek z.B. in mehreren Projekten verwendet und man diese aktualisieren will dann hat man ziemlich schnell einen ganzen haufen Arbeit. Evtl. kommt noch dazu, dass man das Build-System neu konfigurieren muss, da Dateien hinzugekommen oder weggefallen sind. Manche Bibliotheken kann man auch nur kompilieren, wenn ganz bestimmte Compiler-/Linker-Optionen gesetzt sind. Da hinterherzulaufen und das herauszufinden was man braucht kann unter umständen auch einige Tage kosten. Da ist es doch viel angenehmer mit
    ./configure --prefix=/usr
    make
    make install
    eine Bibliothek zu erzeugen und sich dann um nichts mehr kümmern zu müssen.
    Bei großen Bibliotheken kommt auch noch die Zeitersparnis beim kompilieren hinzu.
    Im übrigen gibt es für D auch sowas wie Header-Dateien, nämlich die Interface-Dateien *.di.
  19. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!