gcc findet sprintf nicht.



  • Hi,
    habe djgpp auf meinem Windowssystem. Habe bislang auch keine Probleme gehabt. Jetzt will ich die Funktion sprintf aufrufen, habe auch stdio.h und stdlib.h eingebunden, und bekomme beim kompilieren meines Codes folgenden Fehler:

    e:\c_source\obj\kernel.o(.text+0x6ed):kernel.c: undefined reference to '_sprintf'
    

    Die Headerdateien sind aber korrekt eingebunden. Daher weiß ich nicht, warum ich diese Fehlermeldung bekomme. Vielleicht kann mir ja iener von euch sagen, warum das Ganze nicht so läuft wie es soll. 😃



  • Wie rufst du den Compiler auf? Benutzt du andere Standard Funktionen?

    Zeig mal ein minimales Beispiel, bei dem der Fehler auftritt.

    Ansonsten ist glaube ich der djgpp veraltet und für Windows ist wohl mingw besser (ebenfalls eine Portierung des GCCs)



  • sprintf(buffer, "%d", time_hour);
    

    reicht schon vollkommen aus, damit der Fehler auftritt.
    Ich habe die Vermutung, dass es evt. an der Library für gcc liegt, da ich parallel auch noch Visual Studio instaliert habe und dies evt. gcc stört. Nur weiß ich leider nicht, wie ich gcc sagen soll, dass es nur seine eigene Library nutzen soll (ist ja alles nur eine Vermutung). MinGW habe ich probiert. Allerdings kommt es nicht mit OBJ Dateien klar, die mit nasm erstellt wurden. Habe auch in einem Forum darüber gelesen, dass es sich nicht zur Erstellung von Betriebssystemen eigenet. Also fällt das für mich raus.

    Falls einer noch etwas dazu weiß, vielen Dank, ich freue mich über jede Antwort 🙂



  • Linkst du überhaupt die Standard-Library, wenn du ein Betriebssystem erstellst?

    Das es zu einem Konflikt mit der Standard-Library vom VC++ kommt, kann man eigentlich ausschließen.

    btw. glaube ich kaum, dass der MinGW sich nicht für die Erstellung eines Betriebssystem eignet.



  • Ich linke wie folgt:

    C:\djgpp\bin\ld -T C:\djgpp\bin\link.ld -o E:\c_source\kernel.bin E:\c_source\obj\ks.o E:\c_source\obj\kernel.o
    

    und der Inhalt der link.ld sieht wie folgt aus:

    OUTPUT_FORMAT("binary")
    ENTRY(start)
    SECTIONS
    {
        .text 0x100000 :
        {
            code = .; _code = .; __code = .;
            *(.text)
            . = ALIGN(4096);
        }
    
        .data :
        {
            data = .; _data = .; __data = .;
            *(.data)
            . = ALIGN(4096);
        }
    
        .bss :
        {
            bss = .; _bss = .; __bss = .;
            *(.bss)
            . = ALIGN(4096);
        }
    
        end = .; _end = .; __end = .;
    }
    


  • Du linkst die Standard Library nicht, was aber beim programmieren eines Betriebssystems normal ist.

    Entweder solltest du die Library linken oder dein eigenes sprintf schreiben.



  • rüdiger schrieb:

    Ansonsten ist glaube ich der djgpp veraltet

    nein 😉



  • Hum.... und wie bekomme ich die Standard Library da jetzt noch zusätzlich rein? Vielen Dank!



  • probier mal -lc als Option, ggf mit -static als weitere Option. Ich bin mir aber nicht sicher, dass das sinnvoll ist.


Anmelden zum Antworten