Abhängigkeiten von <stdarg.h> und <stdio.h> bezüglich vprintf()



  • Sehr geehrte ANSI-C - Experten des Forums,

    mein Compiler raubt mir seit Tagen den Nerv: 😡
    Ich habe versucht, mittels vprintf() eine Bildschirm- Maske aufzubauen, deren Inhalt ich über einfache Aufrufe updaten kann.

    Habe mich dazu eines Beispiels von pronix.de bezüglich <stdarg> und vprintf() zum Abpinseln bedient. Dabei trat auf, daß der Compiler durchlief, aber der Linker vprintf() nicht finden und einbinden konnte.

    Die Reihenfolge der includes war:

    #include <stdlib.h>
    #include <stdio.h>
    #include <stdarg.h>
    

    Eine kleine Ewigkeit später 😞 fiel mir beim Durchsehen der Libs auf, daß vprintf() unter conditional compile via #ifdef auf die Existenz der Argumenttypen aus <stdarg> geschaltet war. Umstellen auf

    #include <stdarg.h>
    #include <stdlib.h>
    #include <stdio.h>
    

    also zuerst <stdarg> includen hat Abhilfe gebracht.

    Nur, bei meinem Eigenbau bleibt der Linker trotz der Umstellung hartnäckig dabei, daß er vprintf() nicht kennt 😮

    In der Library selbst finde ich keine weiteren Abhängigkeiten außer der obig erwähnten.

    Welche Möglichkeiten könnte ich sonst genutzt haben, mir selbst ins Knie zu schießen 😕 Ist dem einen oder anderen von euch ähnliche Seltsamkeit widerfahren?

    *winkeinsforum - und geh erstmal mit dem Hund Gassi* 😃



  • Der Standard gibt folgende Übersicht bzgl. der Header

    #include <stdarg.h>
    #include <stdio.h>
    int vprintf(const char * restrict format, va_list arg);
    

    Was den Fehler beim Linken betrifft, da kann ich nur spekulieren. Hat deine Lib evtl. keine Definition von vprintf? Wie lautet denn der Fehler genau?



  • Hallo Groovemaster,

    doch, die Lib enthält durchaus vprintf.
    Ausschnitt aus der <stdio.h>:

    #ifdef _VA_LIST_DEF
    int vprintf(const char _far *format, va_list ap);
    int vfprintf(FILE _far *st, const char _far *format, va_list ap);
    int vsprintf(char _far *s, const char _far *format, va_list ap);
    #endif
    

    Die Implementation ist auch da, sonst würde ja das Beispiel aus Pronix.de nicht compilieren und linken. Gut, und wenn man <stdarg.h> VOR <stdio.h> einbindet, funzt das Beispiel wirklich (weil dann _VA_LIST_DEF definiert ist).

    Im relozierbaren Zwischencode fehlt aber bereits _vprintf (value is undefined), d.h. vprintf() ist gar nicht erst aus der Lib geholt worden.

    Hilft das weiter? 😕



  • Ich hab's gefunden ... :p
    Der Compiler ist ja ein Witzbold ... ein Projekt besteht ja aus mehreren Dateien und einige davon brauchen die <stdio.h>. Wenn er aber als erste Datei eine erwischt, die <stdarg.h> nicht vorher includiert, läßt er vprintf() und Konsorten einfach liegen.
    Bei der zweiten Datei, die zwar vorher <stdarg.h> inkludiert hat und dann <stdio.h> compilieren soll, ist er wohl der Meinung, daß er das nicht zu tun braucht, weil er die ja schon gebaut hat, zwar ohne vprintf(), aber das juckt ihn erst beim Linken. 😮

    In den Beginn der Hauptdatei ein #include <stdarg.h> setzen, das war's ... schon wieder Tage für nix futsch 😡


Anmelden zum Antworten