[HILFE] *.h - includes - unresolved



  • Hallo zusammen,

    ich habe ein Problem mit dem includen von Dateien.
    Das sieht folgender maßen aus:

    problem.h:

    /* Includes */
    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
    #include <io.h>
    #include <stdlib.h>
    
    /* Prototyp */
    int funktion(int);
    

    problem.c

    /* Includes */
    #include "problem.h"
    
    /* Funktionen */
    int funktion(int param1)
    {
    ...
    }
    

    irgendeineanderedatei.c

    /* Includes */
    #include "problem.h"
    
    int r = funktion(99);
    

    _____________________________
    Das Problem ist, dass ich auf die Funktion in der problem.c nicht zugreifen kann. Er findet Sie quasi nicht. Wenn ich die problem.c statt der problem.h in der irgend... include, dann klappt es, aber das ist ja nicht der Sinn der ganzen Aktion.

    Ich kriege das mit dem #ifdef / #ifndef nicht gebacken.
    Kann mir jemand sagen, wie die problem.h aussehen muss?
    Ich gehe mal davon aus, dass die anderen beiden Files so ok sind mit den Includes.

    Ich muss ja sicher in der problem.h auch die anderen Includes in so ein #ifdef / #ifndef setzen.
    Wäre toll, wenn mir mal jemand auf die Sprünge hilft.

    THX im Voraus!!!

    greetz,
    mid

    [ Dieser Beitrag wurde am 12.12.2002 um 18:37 Uhr von Midnighter editiert. ]



  • Falls du mit dem #ifdef / #ifndef die Include-Guards meinst, dann funktioniert das so:

    #ifndef IRGENDEIN_NAME_H
    #define IRGENDEIN_NAME_H
    ...
    ...
    #endif
    

    Das schützt davor, ein Headerfile zweimal zu inkludieren.



  • Hi gary,

    ja das war eins der Dinge, die ich wissen wollte.
    Sehe ich das richtig, dass ich bei mehreren Includes immer jeweils mit nem #endif abschließen muss?!

    BSP:
    #ifndef stdio_h
    #define stdio_h
    #endif

    #ifndef string_h
    #define string_h
    #endif

    Aber was noch viel dringender brennt, ist die Frage, warum ich meine Funktionen nicht aufrufen kann. Ich hab so ne Art Bibliothek geschrieben, wo allerhand nützliche Funktionen drin stehen. das ist die C-Datei, die ich oben problem.c genannt habe. In der include ich nur die zugehörige Headerdatei problem.h.
    In der problem.h stehen die ganzen Hederdateien, die ich in problem.c benötige.

    In dieser Headerdatei stehen die Funktionsprototypen od. Deklarationen der Funktionen in problem.c.

    Wenn ich das nun mal weiter geben will, dann soll der Benutzer nur die problem.h einbinden um auf die Funktionen in der problem.c zugreifen zu können.

    Allerdings klappt das nicht, dass ich an die Funktionen rankomme. Der Linker wirft mir folgenden Fehler:
    (1) test.obj : error LNK2001: Nichtaufgeloestes externes Symbol _getFullTag
    (2) Debug/id3test.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise

    Kann da jemand von Euch Abhilfe schaffen.
    Dann wäre ja Weihnachten gerettet. 😃

    greetz,
    mid



  • #endif musst du an das Ende deines Headers machen eben als Gegenstück zu #if 🙂

    zu deinem 2. Problem: da musst du schon ein bissel mehr Code zeigen 🙂



  • da musst du schon ein bissel mehr Code zeigen

    Kein Problem. 😉

    Datei: ID3v1.h

    /*** Die ganzen Includes die ich für ID3v1.c benötige***/
    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
    #include <io.h>
    #include <stdlib.h>
    
    ...
    
    /*** Prototyp einer Funktion aus ID3v1.c ***/
    int removeTag(char *path);
    /********************************/
    /* Return-Values:               */
    /*   0 - TAG removed            */
    /*   1 - File not found         */
    /********************************/
    
    ...
    

    Datei: ID3v1.c

    /*********** Includes ***********/
    #include "ID3v1.h"
    
    ...
    
    /*** eine Funktion, deren Prototyp in ID3v1.h deklariert ist ***/
    int removeTag(char *path)
    {
        FILE *fp;
        int i = checkID3v1(path);
        if(i == 0)
        {
            if(fp = fopen(path, "r+b"))
            {
                if( !chsize(fileno(fp), filelength( fileno(fp) ) - 128) )
                {
                    fclose(fp);
                    return 0;   
                }
            }
        }
        if(i == 1) return 0;
        return 1; 
    }
    
    ...
    

    So. Die Funktionen in der ID3v1.c möchte ich jetzt auch in anderen Projekten verwenden. Dazu soll man ja die ID3v1.h includen.

    Also habe ich irgend ein anderes Projekt mit der Datei project2.c.
    Die sieht dann meinetwegen so aus:

    Datei: project2.c

    #include "ID3v1.h"
    
    void main(void)
    {
        char *path = "C:\\mp3datei.mp3";
        int result = removeTag(path);
    }
    

    Jetzt sollte die project2.c doch eigentlich durch das Includen der ID3v1.h die ganzen Funktionen aus ID3v1.c kennen?!?! Tut sie aber nicht, weil "unresolved ...".
    Da brauch ich jetzt Eure Hilfe. Wie muss ich das machen, dass man meine beiden Dateien einfach in ein anderes Project kopieren kann und nur durch include der Headerdatei die ganzen Funktionen nutzen kann?

    Und wenn noch was geht, dann wäre es noch interessant, was ich mit den Include-Guards mache, um den ganzen Spass abzusichern, in Hinsicht auf doppelt eingebundene Headerdateien.

    Schonmal ein DICKES DANKESCHÖN an jeden der bis hier gelsen hat!!!!!!

    greetz,
    mid



  • problem.h:

    #ifndef PROBLEM_H
    #define PROBLEM_H
    
    /* Includes */
    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
    #include <io.h>
    #include <stdlib.h>
    
    /* Prototyp */
    int funktion(int);
    
    #endif // PROBLEM_H
    

    Dieser Code-Abschnitt müsste alle Fragen über Include-Guards beantworten.
    Zu deinem zweiten Problem: Hast du die problem.cpp in das neue Projekt eingefügt? (das musst du nämlich, außer du schreibst eine Headerdatei für eine DLL)



  • Dieser Code-Abschnitt müsste alle Fragen über Include-Guards beantworten.
    Zu deinem zweiten Problem: Hast du die problem.cpp in das neue Projekt eingefügt? (das musst du nämlich, außer du schreibst eine Headerdatei für eine DLL)

    ICH BIN SO EIN IDIOT!!!!!!!!!!

    Danke, das isses. Un danke für die Guard-Hilfe!!!!

    greetz,
    mid


Anmelden zum Antworten