Undefined Reference to - Neues C FIle

Talantyyr

Grünschnabel
Hallo,

Ich bin gerade dabei, ein OpenSource Projekt ( http://code.google.com/p/hugo-gx/ ) zu erweitern, habe nun aber folgedes Problem.
Habe in dem source Verzeichnis, wo auch alle anderen .c Files liegen ein neues File ( preferences.c / .h )hinzugefügt, und ein paar neue Funktionen geschrieben. Dies compiliert auch alles wunderbar.
Eine der Funktionen habe ich dann auch via Prototyp in der preferences.h verfügbar gemacht und in einem bestehenden .c File via #include "preferences.h" eingebunden.
Will ich nun eine Funktion daraus benutzen wirft der Linker eine undefined Reference to savePrefs() (dies ist die zuvor erwähnte Funktion aus der preferences.c) Meldung, die ich mir nicht ganz erklären kann.

Als Compiler verwende ich devkitpro (gcc ?) und folgendes Makefile:
http://code.google.com/p/hugo-gx/source/browse/trunk/Makefile.wii

Anhand des Makefiles denke ich, dass alle Files, die im "source" Verzeichnis liegen compiliert werden und anschließend ebenfalls als .o File gelinkt werden müssten.

Wo liegt hier der Fehler? Ich kann es mir echt nicht erklären, und würde liebend gerne neue Files verwenden, um die Übersichtlichkeit beizubehalten.

Bitte um Hilfe!
Danke,
Chris
 
Moin,

das Problem ist offenbar, dass kein preferences.o verfügbar ist. Du musst also preferences.c in deinem Build-Prozess einschließen.

Gruß,

badday
 
Kann das sein, dass du nur den Prototypen hingeschrieben hast, aber nicht die Definition.
 
Hi.
Anhand des Makefiles denke ich, dass alle Files, die im "source" Verzeichnis liegen compiliert werden und anschließend ebenfalls als .o File gelinkt werden müssten.
Ja, das sieht wohl so aus.

Was passiert denn wenn du make aufrufst? Welche Kommandos werden denn ausgeführt?

Und poste den Code und die Fehlermeldungen.

Gruß
 
Danke für die Antworten!

Ich habe gerade nochmal drüber geschaut und festgestellt, dass ich die files nicht als .c sonder als .cpp gespeichert habe...
Hab die Files in .c umbenannt, den Build Ordner gelöscht und make gestartet... und siehe da, ich bekomme andere Fehlermeldungen...
Zwar mindestens genauso unverständlich, aber vllt könnt ihr da ja Licht in die Sache bringen? Ich denke dass damit zumindest der undefined reference Fehler verschwunden ist.


C:\devkitpro\hugo-gx-read-only>make
fileop.c
c:/devkitpro/hugo-gx-read-only/source/fileop.c:212: error: conflicting types for 'SaveFile'
c:/devkitpro/hugo-gx-read-only/source/fileop.c:159: note: previous definition of 'SaveFile' was here
c:/devkitpro/hugo-gx-read-only/source/fileop.c: In function 'SaveFile':
c:/devkitpro/hugo-gx-read-only/source/fileop.c:214: warning: passing argument 2 of 'SaveFile' makes integer from pointer without a cast
c:/devkitpro/hugo-gx-read-only/source/fileop.c:212: note: expected 'size_t' but argument is of type 'char *'
c:/devkitpro/hugo-gx-read-only/source/fileop.c:214: error: too many arguments to function 'SaveFile'
make[1]: *** [fileop.o] Error 1
make: *** [build_wii] Error 2

Was ich daran nicht ganz verstehe, ist das ich die SaveFile() eigtl überladen habe....

Das sind die Prototypen:
Code:
size_t SaveFile(char * buffer, char *filepath, size_t datasize, bool silent);
size_t SaveFile(char * filepath, size_t datasize, bool silent);

Das sind die Funktionen:
Code:
size_t SaveFile(char * buffer, char *filepath, size_t datasize, bool silent)
{
    size_t written = 0;
    size_t writesize, nextwrite;
    int retry = 1;
    int device = 2;
        

    if(datasize == 0)
        return 0;

    // stop checking if devices were removed/inserted
    // since we're saving a file
    //HaltDeviceThread();

    // halt parsing
    //HaltParseThread();

    while(!written && retry == 1)
    {
        if(! MountFAT(device, silent))
            break;

        file = fopen (filepath, "wb");

        
        while(written < datasize)
        {
            if(datasize - written > 4096) nextwrite=4096;
            else nextwrite = datasize-written;
            writesize = fwrite (buffer+written, 1, nextwrite, file);
            if(writesize != nextwrite) break; // write failure
            written += writesize;
        }
        fclose (file);

        if(written != datasize) written = 0;

        if(!written)
        {
            unmountRequired[device] = true;
            if(silent) break;
        
        }
    }

    // go back to checking if devices were inserted/removed
    //ResumeDeviceThread();

    return written;
}


size_t SaveFile(char * filepath, size_t datasize, bool silent)
{
    return SaveFile((char *)savebuffer, filepath, datasize, silent);
}
 
Eventuell wird deine Datei mehrfach eingebunden deshalb schreibe mal das um den Quelltext:
C++:
#ifndef _FILEOP_C
#define _FILEOP_C

// DEIN QUELLTEXT

#endif
Somit wird deine Datei max. 1 eingebunden.
 
Zurück