Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Makefile und undefined reference

  1. #1
    Registrierter Benutzer
    Registriert seit
    25.11.2002
    Beiträge
    68

    Makefile und undefined reference

    Hallo liebe Entwickler,

    aus dem Bedürfnis heraus mich nähr mit C++ zu beschäftigen, hab ich angefangen einige kleinere Projekte umzusetzen. Bei einem dieser Projekte stehe ich vor dem Problem, nicht sonderlich viel von Makefiles zu verstehen und eine für mich obskure Fehlermeldung zu erhalten. Die letzten Stunden try-and-error und durchsuchen diverser Makefile-Howtos half leider nicht weiter und so hoffe ich jemand hier im Forum könnte mir eine Anregung geben.

    Zum Sachverhalt (die Quellen wurden aufs wesentliche reduziert);

    main.cpp
    #include "config.h"
    #include <string>
    int main(int argc, char **argv){
    testcase::Config::WorkPath = "/home/dipesh/testcase/";
    return 0;
    }
    config.h
    #include <string>
    namespace testcase {
    class Config {
    public:
    static std::string WorkPath;
    };
    //std::string Config::WorkPath = "/home/dipesh/anothertestcase/";
    }
    Makefile
    CC = g++ -g -Wall
    BIN = mytestcase
    CFLAGS =
    LDFLAGS =
    all: main.o
    <tab>$(CC) main.o -o $(BIN) $(LDFLAGS)
    main.o: main.cpp config.h Makefile
    Beim Versuch das Ganze mittels make zu kompilieren erhalte ich eine Fehlermeldung der Art
    In function `main':
    : undefined reference to `testcase::Config::WorkPath'
    In den qmake pro-Dateien gibt es die nette Variante SOURCES und HEADERS zu definieren und gut ist. Nur wie wird das bei Makefiles definiert? Ein einfaches #include "config.h" in der main.cpp scheint wohl nicht ausreichend zu sein. Zumal die config.h später ebenfalls in anderen cpp-Dateien zum Einsatz kommen soll und die definierten statischen Variablen auf diesem Wege allen Klassen zur Verfügung stehen sollen.
    Danke im voraus für jeden Hinweis bzw. jede Anregung.
    Geändert von dipesh (10-10-2004 um 18:15 Uhr)
    s/(win|dos)/linux/g; #just another fixed pain in the (gl)ass

  2. #2
    Registrierter Benutzer
    Registriert seit
    25.11.2002
    Beiträge
    68
    Mir ist zwar nicht bewusst warum, aber wenn ich eine config.cpp mit aufnehme und statt in der .h dort
    std::string Config::WorkPath = "/home/dipesh/anothertestcase/";
    eintrage, funktioniert das Ganze wie gewünscht...
    Scheint wohl, daß eine .h-Datei alleine nicht in der gewünschten Weise verarbeitet werden kann. Interessant.
    s/(win|dos)/linux/g; #just another fixed pain in the (gl)ass

  3. #3
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Scheint wohl, daß eine .h-Datei alleine nicht in der gewünschten Weise verarbeitet werden kann.
    Das schon. Die Deklaration einer statischen Variable in einer Klasse ist allerdings keine Definition. Eine Definition ist das was du in deine config.cpp eingetragen hast. Wäre die Deklaration einer statischen Variable in einer Klasse auch eine Definition, würde das ja zu Fehlern führen wenn die Header Datei mehrmals inkludiert wird. Dann hätte man mehrere Definitionen ein und derselben Sache in einem Programm, und das ist (natürlich) verboten.

  4. #4
    Registrierter Benutzer
    Registriert seit
    25.11.2002
    Beiträge
    68
    Zitat Zitat von locus vivendi
    Die Deklaration einer statischen Variable in einer Klasse ist allerdings keine Definition. Eine Definition ist das was du in deine config.cpp eingetragen hast.
    Davon ging ich auch aus. Daher auch der Versuch der Definition mit der auskommentierten Zeile in config.h.

    Zitat Zitat von locus vivendi
    Wäre die Deklaration einer statischen Variable in einer Klasse auch eine Definition, würde das ja zu Fehlern führen wenn die Header Datei mehrmals inkludiert wird.
    Die mehrfache Inkludierung wird doch durch die Angabe von
    #ifndef _myproject_myfile_h
    #define _myproject_myfile_h
    ...
    #endif
    innerhalb der Headerdatei verhindert. Das define sollte doch eigentlich Projektweit für alle h/cpp-Dateien gelten und die Headerdatei somit im gesamten Projekt genau 1x (vorausgesetzt sie wird überhaupt irgendwo inkludiert) gleichsam als forward-Deklaration eingebunden werden.
    Memberfunktion können in einer Headerdatei schließlich auch gleichzeitig deklariert und definiert werden ( class MyClass { void tunichts(){} } ; ), warum geht dies also nicht mit (statischen) Membervariablen?
    Geändert von dipesh (14-10-2004 um 13:30 Uhr)
    s/(win|dos)/linux/g; #just another fixed pain in the (gl)ass

  5. #5
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    [...] Das define sollte doch eigentlich Projektweit für alle h/cpp-Dateien gelten und die Headerdatei somit im gesamten Projekt genau 1x (vorausgesetzt sie wird überhaupt irgendwo inkludiert) gleichsam als forward-Deklaration eingebunden werden.
    Das gilt nur für eine Übersetzungseinheit. Wird ein Programm aus mehreren Übersetzungseinheiten zusammengelinkt, würden mehrfache Definitionen entstehen.


    Memberfunktion können in einer Headerdatei schließlich auch gleichzeitig deklariert und definiert werden ( class MyClass { void tunichts(){} } ; ), warum geht dies also nicht mit (statischen) Membervariablen?
    Weil man es so festgelegt hat. Inline - Funktionen und Templates dürfen mehrfach definiert werden. Für diese Konstrukte ist es ja auch notwendig das ihre Definition in jeder Übersetzungseinheit in der sie benutzt werden sichtbar ist.

  6. #6
    Registrierter Benutzer
    Registriert seit
    25.11.2002
    Beiträge
    68
    Danke :-)
    (zehn Zeichen +n)
    s/(win|dos)/linux/g; #just another fixed pain in the (gl)ass

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •